Neue Write und Read Befehle

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Neue Write und Read Befehle

BeitragDi, März 10, 2009 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 10, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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 Wink
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

Xaymar

ehemals "Cgamer"

BeitragDi, März 10, 2009 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 10, 2009 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xaymar

ehemals "Cgamer"

BeitragDi, März 10, 2009 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, März 10, 2009 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xaymar

ehemals "Cgamer"

BeitragDi, März 10, 2009 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt mein Fehler, Ich hatte immer noch mit 64bit(c++ >_>) gerechnet. Werde ich gleich berichtigen.
Warbseite
 

Düsi

BeitragDi, Aug 04, 2009 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

Xaymar

ehemals "Cgamer"

BeitragDi, Aug 04, 2009 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei funzen die befehle so wie die da stehen.
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group