AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi <Stream>.Read(<Word>, 2) überspringt ein Byte
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von xZise · begonnen am 4. Sep 2008 · letzter Beitrag vom 6. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
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, 21: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
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 4. Sep 2008, 21:55
"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?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

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

  Alt 4. Sep 2008, 22:10
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

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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 4. Sep 2008, 22:13
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;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

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

  Alt 4. Sep 2008, 22:18
Glückwunsch, ihr habt beide die gleiche Funktionalität, einmal lang, einmal kurz. Endianness heisst nicht umsonst "Byteorder", Appo ;o)
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#6

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

  Alt 4. Sep 2008, 22:23
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 4. Sep 2008, 22:27
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

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

  Alt 4. Sep 2008, 22:29
Hallo,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#9

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

  Alt 4. Sep 2008, 22:33
Argh 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
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#10

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

  Alt 4. Sep 2008, 22:35
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 ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.
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