[Gelöst] Int64 aus Stream lesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

[Gelöst] Int64 aus Stream lesen

Beitrag von Komoluna »

Hi,

Ich versuche in meinem Projekt eine Binärdatei zu lesen, die von einem Java Programm(Minecraft) geschrieben wurde.
Das Dateiformat ist NBT. http://wiki.vg/NBT#Specification
Es funktioniert alles auch Prima bis auf die Long Tags.
Auf der besagten Wikiseite steht, ein LongTag sei ein signed BigEndian 64-Bit Integer

Meine Ladeprozedur:

Code: Alles auswählen

 
var
  val_long: Int64;
begin
aStream.Read(val_long, SizeOf(val_long));
val_Long := SwapEndian(val_Long);
geht aber nur bei kleinen Werten.
In der Angehängten Beispieldatei sind ganz am Ende 2 Long Tags:
Der Wert von SizeOnDisk wird korrekt angezeigt, während der von RandomSeed falsch ist. Der Binäre Zahlenwert folgt direkt auf den Namen
( https://irath96.github.io/webNBT/ ist ein Online NBT viewer/editor der Bei SizeOnDisk den selben und bei RandomSeed einen anderen Wert anzeigt)

Kann mir irgendwer sagen warum sich das Programm bei großen Zahlen anders verhält als bei kleinen?

MFG

Komoluna
Dateianhänge
out.txt
Die genannten Daten beginnen bei Addresse $546
(1.35 KiB) 58-mal heruntergeladen
Zuletzt geändert von Komoluna am Mi 16. Sep 2015, 15:58, insgesamt 1-mal geändert.
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Int64 aus Stream lesen

Beitrag von theo »

Bist du sicher, dass du das richtig ausliest (Position)?
Die dort stehenden Bytefolgen geben doch genau das selbe Resultat wie der NBT Editor.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var i1,i2:int64;
begin
 i1:=$8590976d00968f83; //RandomSeed
 i2:=$0000000006c0d1d1; //SizeOnDisk
 Caption:=IntToStr(i1)+' / '+IntToStr(i2);
end;  
Das SwapEndian ist aber schon richtig von Stream.
MMn liest du an der falschen Position.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Int64 aus Stream lesen

Beitrag von Komoluna »

Manchmal sieht man den Wald vor lauter Bäumen nicht.
Der Wert wurde richtig ausgelesen und abgespeichert. Nur dannach habe ich (warum auch immer) den Wert auf Int gecastet...
Kein wunder, dass kleine Werte korrekt angezeigt werden, große aber nicht.

Trotzdem danke theo

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Int64 aus Stream lesen

Beitrag von Socke »

theo hat geschrieben:Das SwapEndian ist aber schon richtig von Stream.
Wäre es nicht richtiger BEToN() (Big Endian to Native) zu verwenden?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: [Gelöst] Int64 aus Stream lesen

Beitrag von Komoluna »

Ja, das habe ich schon umgestellt.
In meinem Fall ist das jetzt nicht so wichtig da das Programm nur unter Windows laufen muss, aber bloß nicht falsch angewöhnen!

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Int64 aus Stream lesen

Beitrag von theo »

Socke hat geschrieben:Wäre es nicht richtiger BEToN() (Big Endian to Native) zu verwenden?
Ja klar, für Plattformunabhängigkeit.

Antworten