Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

<Stream>.Read(<Word>, 2) überspringt ein Byte

  Alt 4. Sep 2008, 20:51
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:
[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
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.

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:
[...]
// 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);
[...]
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.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat