Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TFileStream und Array...Daten verkehrt herum? (https://www.delphipraxis.net/107677-tfilestream-und-array-daten-verkehrt-herum.html)

Tyrael Y. 31. Jan 2008 16:05


TFileStream und Array...Daten verkehrt herum?
 
Hallo zusammen,

irgendwie versteh ich grad das Verhalten von TFileStream nicht.

Ich habe TFileStream schon oft benutzt und mir dabei nie die Daten in der Datei genau angeschaut. Schon zig-tausendmal in Dateien Daten reingeschrieben und wieder gelesen, alles ohne Probleme.


Ich habe eine Datei und wenn ich mir diese Datei mit UltraEdit angucke fängt die Datei zB folgendermassen an.

Zitat:

00 00 0A 7C 00 00 0A 7C 00 00 0A 7C OC 23 90 08

Ich lese diese 16 Bytes folgendermassen aus, da jeweils 4 Bytes eine Zahl ist, die ich benötige.

Delphi-Quellcode:
procedure TuWas();
var
  LStream: TFileStream;
  LArray: array of integer;
begin
...
...
//Länge des Arrays setzen
SetLength(LArray, 4);
...
LStream.Read(LArray[0], 16);
..erwartet hab ich in LArray[0] zB die Zahl 2684 was den ersten vier Bytes entsprechen würde (00 00 0A 7C).
...erhalten habe ich in LArray[0] 2081030144 was der Hex-Darstellung (7C 0A 00 00) entspricht

Also wurden die Daten byteweise verkehrt herum in mein Array gelesen.

Wieso das?


Ich glaub es ist zu spät und ich steh grad nur auf dem Schlauch.
Ich mach jetzt Feierabend und guck mir die Geschichte mal morgen nochmal an.

(Wahrscheinlich fällt es mir mein Denkfehler auf dem Heimweg auf -.-)


Danke fürs Lesen

sirius 31. Jan 2008 16:07

Re: TFileStream und Array...Daten verkehrt herum?
 
Dann such mal nach Little Endian (oder Big Endian).

Tyrael Y. 1. Feb 2008 07:43

Re: TFileStream und Array...Daten verkehrt herum?
 
Mit folgender Funktion krieg ich genau das, was ich suche.

Delphi-Quellcode:
function SwapBytes(const ANumber: Cardinal): Cardinal;
asm
  mov edx, ANumber;
  bswap edx;
  mov result, edx;
end;
Danke sirius für den Schlag auf den Hinterkopf ;)

sirius 1. Feb 2008 07:48

Re: TFileStream und Array...Daten verkehrt herum?
 
Aber warum willst du das vertauschen?

Tyrael Y. 1. Feb 2008 07:52

Re: TFileStream und Array...Daten verkehrt herum?
 
Weil ich zB. wie oben beschrieben die Zahl 2684 brauche, um weiterzurechnen und nicht das umgedrehte, was beim Lesen durch den Filestream in meinem Buffer steht.

Muetze1 1. Feb 2008 15:13

Re: TFileStream und Array...Daten verkehrt herum?
 
Daran hat aber der Filestream keine Schuld, sondern es wurde so in der Datei gespeichert. Das ist das allgemeine Verhalten der x86 Architektur und das Dateiformat basiert halt auf z.B. der Motorola 68k Architectur, welche das (im eigentlichen richtigen Sinne) speichert organisiert.

negaH 1. Feb 2008 15:18

Re: TFileStream und Array...Daten verkehrt herum?
 
Delphi-Quellcode:
function SwapBytes(const ANumber: Cardinal): Cardinal;
asm
  mov edx, ANumber;
  bswap edx;
  mov result, edx;
end;
ist "doppelt" gemoppelt, besser so

Delphi-Quellcode:
function SwapBytes(Value: Cardinal): Cardinal; register;
asm
  bswap eax
end;
BSWAP wird nicht auf allen CPU Plattformen unterstützt.

Gruß hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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