Aktuelle Zeit: 14.10.2019 23:12

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PureBasic macht mit dem Byte 0 irgendwie nicht mit :(
BeitragVerfasst: 11.09.2004 00:49 
Offline
Benutzeravatar

Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 01:02 
Online
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
Ich weiß jetzt ohne Codebeispiel von Dir nicht genau, wie du das meinst.

Habe mal folgendes ausprobiert:

Code:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 01:08 
Offline
Benutzeravatar

Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
ich meinte, das ganze so:

ich reserviere jetz mit
Code:
*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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 01:28 
Online
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 01:49 
Offline
Benutzeravatar

Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
asoooooo.... ich trottel -_- sollte mehr lesen, danke das du dir die mühe gemacht hast :D

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 17:40 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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:
; *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

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.09.2004 19:48 
Offline
Benutzeravatar

Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
danke :D

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Falko und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye