Neue Write und Read Befehle
Übersicht

![]() |
Xaymarehemals "Cgamer"Betreff: Neue Write und Read Befehle |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mich hat es immer geärgert das BB nicht die meistens verwendete Lese/Schreib Methode unterstützt.
Deshalb hab ich mir kurzerhand diese selbstgeschrieben. Ich habe diese nur teilweise getestet und WriteFloat/ReadFloat kann deshalb Fehler beinhalten. Ich freue mich über Kommentare und Korrigierungen. Kritik erwünscht, sofern es nicht "Das gabs aber schon" ist. Code: [AUSKLAPPEN] Function WriteStringNew(Stream, Strng$)
If Stream <> 0 Ln = Len(Strng$) For Pos = 1 To Ln WriteByte Stream, Asc(Mid(Strng$, Pos, 1)) Next WriteByte Stream, 0 Return 1 Else Return 0 EndIf End Function Function WriteFloatNew(F#) ;Min=0, Max=4294967296 If Stream <> 0 ;BB: Min=-2147483647, Max=2147483648 (Not Sure) Byte1 = F# And $FF Byte2 = ((F# And $FF00) Shl 8) Byte3 = ((F# And $FF0000) Shl 16) Byte4 = ((F# And $FF000000) Shl 24) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 WriteByte Stream, Byte4 Return 1 Else Return 0 EndIf End Function Function WriteInt32New(Stream, Int32) ;Min=0, Max=4294967296 If Stream <> 0 ;BB: Min=-2147483647, Max=2147483648 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Byte4 = ((Int32 And $FF000000) Shl 24) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 WriteByte Stream, Byte4 Return 1 Else Return 0 EndIf End Function Function WriteInt24New(Stream, Int24) ;Min=0, Max=16777216 If Stream <> 0 ;BB: Min=-8388607, Max=8388608 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 Return 1 Else Return 0 EndIf End Function Function WriteShortNew(Stream, Short) ;Min=0, Max=65535 If Stream <> 0 ;BB: Min=-32767, Max=32768 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) WriteByte Stream, Byte1 WriteByte Stream, Byte2 Return 1 Else Return 0 EndIf End Function Function ReadStringNew$(Stream) If WaitOnData(Stream, 2500) = 1 While Not Eof(TCPS) Byte = ReadByte(Stream) If Byte > 0 Out$ = Out$ + Chr(Byte) Else Return Out$ EndIf Wend Return "" EndIf Return "" End Function Function ReadFloatNew#(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Byte4 = ReadByte(Stream) F# = (Byte4 Shr 24) Or (Byte3 Shr 16) Or (Byte2 Or 8) Or Byte1 Return F# EndIf Return 0 End Function Function ReadInt32New(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Byte4 = ReadByte(Stream) Integ = (Byte4 Shr 24) Or (Byte3 Shr 16) Or (Byte2 Or 8) Or Byte1 Return Integ EndIf Return 0 End Function Function ReadInt24New(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Integ = (Byte3 Shr 16) Or (Byte2 Shr 8) Or Byte1 Return Integ EndIf Return 0 End Function Function ReadShortNew(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Short = (Byte2 Shr 8) Or Byte1 Return Short EndIf Return 0 End Function Function WaitOnData(Stream, TimeOut=10000) MSec = MilliSecs() While Eof(Stream) If MilliSecs()-MSec Return 0 EndIf WaitTimer RespTimer Wend Return 1 End Function Function WriteData(Stream, Dat$) For A = 1 To Len(Dat$) WriteByte Stream, Asc(Mid(Dat$, A, 1)) Next Return 1 End Function Function AddString$(Dat$, Txt$) Dat$ = Dat$ + Txt$ + Chr(0) Return Dat$ End Function Function AddString2$(Dat$, Txt$) Dat$ = Dat$ + Txt$ Return Dat$ End Function Function AddInt$(Dat$, I) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Byte4 = ((Int32 And $FF000000) Shl 24) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) + Chr(Byte3) + Chr(Byte4) Return Dat$ End Function Function AddSmallInt$(Dat$, I) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) + Chr(Byte3) Return Dat$ End Function Function AddShort$(Dat$, S) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) Return Dat$ End Function Function AddByte$(Dat$, B) Dat$ = Dat$ + Chr(B) Return Dat$ End Function Have fun CGamer *10.03.09 17:55* Flüchtigkeitsfehler behoben *10.03.09 18:42* Floats berichtigt *10.03.09 18:50* "Original Lese/Schreib Methode" in "meistens verwendete Lese/Schreib Methode" geändert *11.03.09 14:30* Versehentlich eingefügtes "Or" entfernt *13.03.09 13:35* Funktionen für das Senden von gepackten Daten hinzugefügt(WriteData...AddByte) |
||
Warbseite |
- Zuletzt bearbeitet von Xaymar am Fr, März 13, 2009 14:49, insgesamt 5-mal bearbeitet
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo genau liegt der Sinn? Abgesehen davon, dass man drei Bytes bei Read/WriteStringNew spart durch nullterminierte Strings (wodurch es aber langsamer wird, denn Blitz kann durch die Längenangabe gleich einen Puffer in der passenden Grösse reservieren), ist der Nutzen vom Rest recht begrenzt.
Nur durch eine eigene Schreibfunktion kannst du nicht einfach die Wertegrenze der Blitz - Datentypen vergrössern ![]() Auch wenn deine Funktionen anders arbeiten würden als die Blitzinternen Befehle, unterliegen die übergegebenen beziehungsweise die zurückgegebenen Werte weiterhin den Beschränkungen von Blitz. Und aus einem Float wird nicht auf magische Weise ein Double, nur weil du 8 Bytes statt vier schreibst/liest (übrigens müsstest du die Float in eine Bank zwischenspeichern, um in Bytes umrechnen zu können - Shr/Shl/And/Or casten automatisch in einen Int um). Wenn sich hinter deinem Code doch ein Sinn verbirgt, der sich mir nicht erschliessen will, wäre eine Erklärung nicht schlecht ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe den Code geschrieben um mit MySQL kommunizieren zu können, was recht kompliziert ist ohne spezielle Funktionen. Bei Float bin ich mir auch ziemlich unsicher und bis jetzt funktioniert es, nur eben Float ist ungetestet. SOllte aber auch funktionieren.
Ich hoffe ich habe deine Frage beantwortet |
||
Warbseite |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt keine ''original'' -Schreib oder Lesemethode. Es gibt die eine die meistens auch der PC nutzt, und andere die immer ein Mac benutzt. Man kann dieses bereits an dem auslesen von Bildheadern sehen. Wie man erkennt, scheiden sich da die Gemüter.
Ansonsten vielleicht für den einen oder anderen ganz nützlich. Allerdings dürften deine ...StringNew() -Befehle nicht funktionieren, da BB nur 32 Bit Integer bearbeiten kann. Die Zuordnung ist also zu groß. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] For A = 0 To 1000
Txt$ = Txt$ + Chr(Rand(32, 126)) Next file=WriteFile("text.txt") WriteStringNew(file, Txt$) CloseFile file End Function WriteStringNew(Stream, Strng$) If Stream <> 0 Ln = Len(Strng$) For Pos = 1 To Ln WriteByte Stream, Asc(Mid(Strng$, Pos, 1)) Next WriteByte Stream, 0 Return 1 Else Return 0 EndIf End Function Funzt bei mir eigentlich für Dateien einwandfrei, TCP strings funzen auch, UDP kann ich nich^^(nur teilweise kann ichs) Wie ggesagt: Ist für meinen MySQL Connector in BB gedacht, da MySQL ein eigenes Format besitzt |
||
Warbseite |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Upsala, ich meinte natürlich die Floats. Denn diese kann BB nur bis maximal 32 Bit bearbeiten. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt mein Fehler, Ich hatte immer noch mit 64bit(c++ >_>) gerechnet. Werde ich gleich berichtigen. | ||
Warbseite |
Düsi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Int32 = 256
Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Byte4 = ((Int32 And $FF000000) Shl 24) Print Byte1 ; 0 Print Byte2 ; 65536 Print Byte3 ; 0 Print Byte4 ; 0 Wie kann das sein? Sollte der Wert nicht 1 betragen statt 65536? Oder bin ich zu dumm 4 Zeilen Code zu kopieren? oO Edit: Zitat: Byte1 = 255
Byte2 = 255 Byte3 = 255 Byte4 = 255 Integ = (Byte4 Shr 24) Or (Byte3 Shr 16) Or (Byte2 Or 8) Or Byte1 Print Integ ; 255 Da kann ja auch was nicht stimmen?! Und nochmal Edit: Müsste es evtl so lauten? Zitat: Int32 = 257
Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shr 8) Byte3 = ((Int32 And $FF0000) Shr 16) Byte4 = ((Int32 And $FF000000) Shr 24) Print Byte1 ; 1 Print Byte2 ; 1 Print Byte3 ; 0 Print Byte4 ; 0 sowie Zitat: Byte1 = 0 Byte2 = 1 Byte3 = 0 Byte4 = 0 Integ = (Byte4 Shl 24) Or (Byte3 Shl 16) Or (Byte2 Shl 8) Or Byte1 Print Integ ; 256 Funktioniert bei mir zumindest perfekt. ![]() |
||
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also bei funzen die befehle so wie die da stehen. | ||
Warbseite |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group