Seite 1 von 2

[erledigt] Long in String(Buchstaben) umwandeln ?

Verfasst: 18.12.2005 21:27
von scholly
moin, moin...
Ich seh mal wieder den Wald vor lauter Bäumen nicht :o
Mit fourCC = ReadLong() lese ich RIFF-Chunks aus einem Binärfile. Für normale Überprüfungen kann ich für "LIST" z.B. so checken:
If fourCC = 'TSIL' : machmadashier : EndIf.
Nun kann es aber sein, daß ein bisher unbekannter FourCC auftaucht, den ich natürlich als 4-stelligen String darstellen möchte.
Gibts dafür eine PB-Funktion ?
bis denne...
scholly

Verfasst: 18.12.2005 21:30
von armada
also wenn ich des richtig lese willst du ne long-variable in nen string umwandeln!?

geht mit Str(zahl)

mfg
armada

Verfasst: 18.12.2005 21:44
von Froggerprogger
Ich denke, scholly meint eher sowas (?):

Code: Alles auswählen

val.l = 'FFIR'
str.s = PeekS(@val,4)
debug val

debug str

Verfasst: 18.12.2005 21:47
von scholly
armada hat geschrieben:also wenn ich des richtig lese willst du ne long-variable in nen string umwandeln!?
Nenene, so einfach isset nich :wink:
Str(12345) macht mir den String "12345"
Ich habe aber z.B. 0x52494646 als Ergebnis eines ReadLong() und möchte das in einen String mit 4 Buchstaben wandeln.

Verfasst: 18.12.2005 22:09
von armada
achso

Chr(ReadByte())

so könntest es machen

oder als long wie du es willst:

Procedure.s long2string(zahl.l)
ProcedureReturn Chr( (zahl<<24) >> 24 ) + Chr( (zahl<<16) >> 24 ) + Chr( (zahl<<8 ) >> 24 ) + Chr( zahl >> 24 )
EndProcedure

ich weiß is jetzt nich die eleganteste lösung...sollte aber funktionieren

Verfasst: 18.12.2005 22:42
von scholly
:praise: Danke !!!

Beide Codes liefern mir das gewünschte, aber verstehen tu ich beide nich.
Egal, Hauptsache ich brauch nich mehr im Dunkeln zu Tappen, wenn ich einem unbekannten FourCC begegne ;)

bis denne...
scholly

Verfasst: 19.12.2005 00:56
von Froggerprogger
PeekS() macht eigentlich genau das, was du wolltest:
Angefangen bei der angegebenen Position im Speicher, hier z.B. an der Adresse von val, wird Byte für Byte der Bytewert gelesen und einfach als ASCII-Wert für den nächsten Buchstaben genommen. Steht dort z.B. der Wert 70 geschrieben, wird daraus ein "F".
Ebenso macht armada das, bloss halt manuell, indem er jedes der 4 Bytes zunächst nach links shifted (um die höheren Bits rauszuschieben) und dann soweit zurück nach rechts (unter Beibehalt des Vorzeichens), dass die Bits dieses Bytes an der Stelle des niedrigsten Bytes stehen.

In diesem Zusammenhang ist mir übrigens eben ein Bug in PB unter die Finger gekommen, bspw. wird 'ßßßß' inkorrekt in eine Zahl übersetzt. Bei Interesse hier: http://forums.purebasic.com/english/vie ... 182#116182

Verfasst: 19.12.2005 01:21
von scholly
@Froggerprogger:
Danke für die Erklärung - Peek und Poke hab ich seit C64er-Zeiten nich mehr inne Finger jehabt. Aber nun sieht mein Code übersichlicher/verständlicher aus.
bis denne...
scholly

Verfasst: 19.12.2005 16:50
von Batze
Du soltest es aber nicht in einem String speichern, da wenn da dann eine 0 in der Zahl ist, der String abgeschnitten wird.

Verfasst: 19.12.2005 16:52
von Kaeru Gaman
du wirst dann allerdings wohl ein problem beim auslesen des strings bekommen:

ein mittenstehendes 0-Byte wird als String-Ende interpretiert....

[edit]Batze war schneller...