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 ?
PureBasic macht mit dem Byte 0 irgendwie nicht mit :(
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Ich weiß jetzt ohne Codebeispiel von Dir nicht genau, wie du das meinst.
Habe mal folgendes ausprobiert:
MfG Falko
Habe mal folgendes ausprobiert:
Code: Alles auswählen
a.s="Hallo"+Chr(32)+"test"; benutzt Chr(32) für SPACE
Debug PeekS(a)
ich meinte, das ganze so:
ich reserviere jetz mit
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
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 -_-
ich reserviere jetz mit
Code: Alles auswählen
*Buffer = AllocateMemory(1024)
Code: Alles auswählen
PeekS()
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 -_-
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
in der Hilfe zu peeks() steht folgendes:
Wenn du den optionellen Parameter 'Länge' von z.B. 1024 auch angibts
würde dann vielleicht der komplette String gelesen.
Gruß Falko
Ist es vielleicht möglich, das das mit dem '0'-Zeichen zu tun haben könnte?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.
Wenn du den optionellen Parameter 'Länge' von z.B. 1024 auch angibts
würde dann vielleicht der komplette String gelesen.
Gruß Falko
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
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.
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