![]() |
<Stream>.Read(<Word>, 2) überspringt ein Byte
Hallo DP,
kann natürlich sein, das ich falsch liege, aber kann es sei das <Stream>.Read(<Word>, 2) (nicht immer ...) ein Byte überspringt. Wenn ich folgende Bytereihenfolge habe:
Code:
Wird damit zum einen eine Vollständige Snakey Fusion Karte dargestellt (btw) und zum anderen habe ich folgendes Problem, dass ich die Länge der Schlange in den Bytes 19 - 0A auslese. Also möchte ich da eine vorzeichenlose ganzzahlige 16 Bit Zahl, wofür sich ja Word anbietet.
[color=#0000ff]Offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F[/color]
[color=#0000ff]000000[/color] 73 66 6C 13 06 0C 00 00 00 00 04 4E 61 6D 65 05 [color=#0000ff]000010[/color] 41 75 74 6F 72 [i]0A 0A 00 03 [u]00 04[/u][/i] 00 00 01 00 02 [color=#0000ff]000020[/color] 00 03 00 00 00 00 00 00 00 00 00 00 00 01 01 01 [color=#0000ff]000030[/color] 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 [color=#0000ff]000040[/color] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [color=#0000ff]000050[/color] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [color=#0000ff]000060[/color] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [color=#0000ff]000070[/color] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [color=#0000ff]000080[/color] 00 00 00 00 00 00 00 Also flucks dahin gedackelt und nun die Bytes ausgelesen mit oben genannten Befehl. Allerdings bekomme ich nun 1024d raus, was verwundert, weil eigentlich sollte da weder bei Little noch bei Big Endian 1024 raus kommen. Erst wenn er ein Byte weiterrutscht sollte das passieren. So sieht der Code dazu aus:
Delphi-Quellcode:
Nun in Zeile zwei liest er "10d" aus und auch in Zeile 5 was die Vermutung stärkt das er völlig korrekt die Bytes 15 und 16 ausgelesen hat. Auch die Schwierigkeit wird auf "0d" gesetzt und in Zeile 11 liest er auch korrekterweise "3d" aus. Aber dann gerät es aus den Fugen, als er in "wordBuffer" "1024d" einließt.
[...]
// Read width AStream.Read(byteBuffer, 1); FWidth := byteBuffer; // Read height AStream.Read(byteBuffer, 1); FHeight := byteBuffer; // Read difficulty AStream.Read(byteBuffer, 1); FDifficulty := byteBuffer; // Read direction AStream.Read(byteBuffer, 1); dirBuffer := TDirection(byteBuffer); // Read snake // ... first the length ... AStream.Read(wordBuffer, 2); [...] MfG xZise |
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
"00 04" entspricht word 0400, also 4 * 0x100, 4 * 256 = 1024. Du bist in die Endianness-Falle gerutscht ;) Wie wird die Länge denn in die Datei geschrieben, little oder big endian?
|
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
Argh ;) Mein Fehler ^^ Ich hatte zuerst auch die LE/BE Theorie, aber nachher dann verworfen, weil ich "hexadezimal" getauscht habe: Also wurde als 0004 4000 :D
Okay, also ich habe die Datei mit HeX erstellt und weiß deshalb nicht wie ich das gespeichert habe, aber normalerweise ist das Bytegrid oben eine direkte Kopie der Datei. Also habe ich die Datei BE gespeichert, was sich auch natürlicher lesen lässt (imho). Kann man es denn als BE lesen. Oder müsste ich das tauschen? Wobei mir zum tauschen nur das einfällt:
Delphi-Quellcode:
MfG
procedure ChangeEndian(var AWord : Word);
var buffer : Byte; begin buffer := AWord shr 1; // shl/shr shifftet Bytewise oder? AWord := AWord shl 1; AWord := AWord and buffer; end; xZise |
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
Byteweiser Shift ist nicht sehr sinnvoll. Die Delphi-Operatoren shiften bitweise, wie es sich gehört.
In einem aktuellen Projekt verwende ich folgenden Code:
Delphi-Quellcode:
function ReverseU2(W: Word): Word;
asm xchg al, ah end; |
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
Glückwunsch, ihr habt beide die gleiche Funktionalität, einmal lang, einmal kurz. Endianness heisst nicht umsonst "Byteorder", Appo ;o)
|
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
IMHO stellt sich das problem wohl nur, weil du Words geschrieben hast und Bytes liesst... da kann er das beim lesen nicht mehr auflösen... probiere doch mal deine daten als word zu lesen, dann sollte es auch ohne muckeln klappen.
|
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
Was willst du mir damit sagen, Dax? Ich habe darauf hingewiesen, dass die Shift-Operatoren entgegen xZises Annahme bitweise shiften und sein Code daher (und weil er in der letzten Zeile or verwenden müsste) nicht funktionieren kann.
In meinem Code hingegen werden die Bytes korrekt getauscht. |
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
|
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
Argh :oops: Da stehen keine achten, da stehen einsen. Ich schiebs mal auf meinen Monitor, der auch schon etliche Jahre nicht mehr ganz so scharfe Bilder zeigt :angel:
|
Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz