PureBasic macht mit dem Byte 0 irgendwie nicht mit :(

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

PureBasic macht mit dem Byte 0 irgendwie nicht mit :(

Beitrag 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 ?
Bild
Benutzeravatar
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:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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 -_-
Bild
Benutzeravatar
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:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

asoooooo.... ich trottel -_- sollte mehr lesen, danke das du dir die mühe gemacht hast :D
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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:

Beitrag 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
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

danke :D
Bild
Antworten