Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi <Stream>.Read(<Word>, 2) überspringt ein Byte (https://www.delphipraxis.net/120043-stream-read-word-2-ueberspringt-ein-byte.html)

xZise 4. Sep 2008 20:51


<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:
[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

Dax 4. Sep 2008 20:55

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?

xZise 4. Sep 2008 21:10

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:
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;
MfG
xZise

Apollonius 4. Sep 2008 21:13

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;

Dax 4. Sep 2008 21:18

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)

grenzgaenger 4. Sep 2008 21:23

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.

Apollonius 4. Sep 2008 21:27

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.

Hawkeye219 4. Sep 2008 21:29

Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
 
Hallo,

hier ist ein Relikt aus Turbo-Pascal: Delphi-Referenz durchsuchenSwap

Gruß Hawkeye

Dax 4. Sep 2008 21:33

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:

grenzgaenger 4. Sep 2008 21:35

Re: <Stream>.Read(<Word>, 2) überspringt ein Byt
 
Zitat:

Zitat von Hawkeye219
Hallo,

hier ist ein Relikt aus Turbo-Pascal: Delphi-Referenz durchsuchenSwap

Gruß Hawkeye

und wenn ich mir die implementierung in ASM ansehe... ist Delphi-Referenz durchsuchenswap wohl noch das schnellste dazu ... :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz