Seite 1 von 1

Chr(0) in Stringvariable ?

Verfasst: 20.03.2006 02:54
von brandelh
Hi,

ich will eine EXE Datei in eine Stringvariable packen (WEB-Download...) und auf Festplatte speichern. Soweit so gut, aber in der EXE sind auch immer chr(0) enthalten und PureBasic scheint diese nicht in Stringvars speichern zu können :(. Auch PeekS() stoppt immer an chr(0), stimmt das so ? PeekS brauche ich weil

Code: Alles auswählen

nLenGet = ReceiveNetworkData(nConID, *cBuffer, nLen)
immer nur in einen Puffer schreiben kann).

Code: Alles auswählen

s$ = "Test"+Chr(0)+"*"   -> sollte "Test_*" sein
Debug s$                                 -> ist aber "Test"
n = Len(s$)
Debug n                                  -> Länge = 4
Gibt es eine Möglichkeit chr(0) anders unterzubringen ?

Meine LoadFromUrl() Funktion funktioniert bei Texten einwandfrei, aber EXE etc. wird zerhackt.

Tschüß
Hubert

Verfasst: 20.03.2006 03:36
von Laurin
Das Zeichen Chr(0) gilt allgemein als Markierung für das Stringende. Daran halten sich alle Stringfunktionen von PureBasic.

Einzig bei PeekS() & PokeS() hat mit die Möglichkeit über das Stopbyte hinauszukommen. Man muss allerdings dazu die genaue Länge des Strings kennen. Durch ReceiveNetworkData() erhält man die genaue Stringlänge.

Code: Alles auswählen

nLenGet = ReceiveNetworkData(nConID, *cBuffer, nLen)   ; nLenGet enthält die Länge des Strings
WriteData(*cBuffer, nLenGet)   ; schreibt alle empfangen Bytes (auch Chr(0)) in eine geöffnete Datei

Code: Alles auswählen

Var$ = "Test" + Chr(0) + "*"     ; Der String ist 6 Zeichen lang (eigendlich ist er 7 Bytes lang,
                                 ; weil noch automatisch ein Chr(0) ans Stringende gesetzt wird)
PointerZuVar.l = @Var$

Debug PeekS(PointerZuVar, 6)     ; Stringausgabe bricht beim ersten Chr(0) ab, aber
Debug PeekS(PointerZuVar + 5, 1) ; das *-Zeichen befindet sich denoch in der Variable.

Verfasst: 20.03.2006 04:29
von brandelh
Hallo,

Danke für die Antwort, ich habe es befürchtet. Die C-Konventionen greifen immer mehr um sich ;-).

Tschüß
Hubert

Verfasst: 20.03.2006 07:42
von NicTheQuick
Strings würde ich dennoch nicht verwenden.

Am besten nimmst du [c]AllocateMemory(Size)[/c] um einen Buffer zu
allokieren, in den du die Daten speicherst. Dann kannst du auch mit
[c]WriteData()[/c] die heruntergeladenen Daten in eine Datei schreiben.

Verfasst: 20.03.2006 23:02
von brandelh
Hallo,

danke, das mit AllocateMemory(Size) habe ich schon verwendet und writedata() ist sicherlich besser als die ganze Datei im Speicher zu halten, es könnten ja GB sein ... aber es ist für mich halt sehr ungewohnt, dass ein Basiccompiler auf chr(0) reagiert.

Das kenne ich nur von Pascal und C.

Tschüß
Hubert

Verfasst: 20.03.2006 23:47
von MVXA
Ist aber Standard...

Verfasst: 20.03.2006 23:53
von ts-soft
MVXA hat geschrieben:Ist aber Standard...
Es gibt keinen BASIC-Standard und es ist in BASIC nicht üblich, das Strings
nullterminiert sind. Aber ich finde es in Ordnung so!

Verfasst: 20.03.2006 23:53
von brandelh
... bei PureBasic, nachdem ich es nun weiß richte ich mich danach.