Seite 1 von 1

PureBasic macht mit dem Byte 0 irgendwie nicht mit :(

Verfasst: 11.09.2004 00:49
von MVXA
Hallo !
Ich hab ein kleines Programm geschrieben, was Serverdaten von einem Spielserver abfragt. Nun hab ich das Problem, dass in der Antwort vom Server unteranderem auch 0 Bytes als trennzeichen verwendet werden.
Problem: Wenn ich den String haben will muss ich den in den Buffer laden (vorreservierter Speicher mit AllocateMemory()). Aber da wird, wenn ich mit PeekS() arbeite nur bis zu dem 0 Byte gelesen. Wie kann ich das umgehen o_O ?

Verfasst: 11.09.2004 01:02
von Falko
Ich weiß jetzt ohne Codebeispiel von Dir nicht genau, wie du das meinst.

Habe mal folgendes ausprobiert:

Code: Alles auswählen

a.s="Hallo"+Chr(32)+"test"; benutzt Chr(32) für SPACE
Debug PeekS(a)
MfG Falko

Verfasst: 11.09.2004 01:08
von MVXA
ich meinte, das ganze so:

ich reserviere jetz mit

Code: Alles auswählen

*Buffer = AllocateMemory(1024)
den Speicher, denn ich brauch um die eingehenden Nachrichten am TCP Socket abzufragen. In der Nachricht stehen Serverdaten, getrennt durch eine 0 Byte. wenn ich jetz versuche den Speicher mit

Code: Alles auswählen

PeekS()
zu lesen, bekomme ich nur die Daten bis zur Null, ab da kommt nix mehr....

P.S. orginal Code hab ich nicht mehr, da ich das abfragen von Server daten nur einmal schnell getestet habe. Dieser Bug ist trozdem noch für mich nervig -_-

Verfasst: 11.09.2004 01:28
von Falko
in der Hilfe zu peeks() steht folgendes:
Help hat geschrieben:Der String muss mit einem '0' Zeichen enden, andernfalls wird der Speicher solange ausgelesen, bis eine '0' auftritt. Ein optionaler Parameter 'Länge' (in Bytes) kann angegeben werden.
Ist es vielleicht möglich, das das mit dem '0'-Zeichen zu tun haben könnte?
Wenn du den optionellen Parameter 'Länge' von z.B. 1024 auch angibts
würde dann vielleicht der komplette String gelesen.

Gruß Falko

Verfasst: 11.09.2004 01:49
von MVXA
asoooooo.... ich trottel -_- sollte mehr lesen, danke das du dir die mühe gemacht hast :D

Verfasst: 11.09.2004 17:40
von NicTheQuick
Die höchste Priorität für [c]PeekS()[/c] ist das Null-Trennzeichen, also auch wenn eine Länge von 1024 Bytes angegeben wird, liest [c]PeekS()[/c] nur bis zum nächsten Nullzeichen aus.
Bei Windows werden Strings standardmäßig mit einem Nullbyte abgeschlossen. Das hat so auch PureBasic übernommen.

Du kannst aber folgenden Code benutzen, um die Strings einzeln auszulesen.

Code: Alles auswählen

; *Char   : Speicheradresse, wo die Strings liegen
; Length  : Länge des allokierten Speichers oder -1 für unbekannte Länge (Vorsicht!)
; i       : Index des Strings (beginnend mit 1)
Procedure.s StringFieldNullByte(*Char.BYTE, Length.l, i.l)
  If i <= 0 : ProcedureReturn "" : EndIf
  While Length
    If i = 1 : ProcedureReturn PeekS(*Char) : EndIf
    If *Char\b = 0 : i - 1 : EndIf
    
    *Char + 1
    Length - 1
  Wend
  ProcedureReturn ""
EndProcedure

Debug StringFieldNullByte(?Strings, -1, 1)
Debug StringFieldNullByte(?Strings, -1, 2)
Debug StringFieldNullByte(?Strings, -1, 3)

DataSection
  Strings:
    Data.s "Hallo"         ; ein Nullbyte wird automatisch angehängt
    Data.s "ich bin"
    Data.s "NicTheQuick!"
EndDataSection

Verfasst: 11.09.2004 19:48
von MVXA
danke :D