![]() |
Bytes im Word drehen
Hallo,
ich steh grad auf der Leitung. Ich lese mit folgenden Code die ersten 2 Bytes einer Datei (in diesem Falle von Bilddateien) aus und prüfe somit um welches Format (BMP, JPG,PNG) es ist. Nun sind aber die 2 Bytes im Word gegenüber der Datei vertauscht (wenn man sich die Datei mit einem Hex-Editor anschaut). Wie kann ich ganz einfach die zwei Bytes im Buffer drehen? Oder anders gefragt, wie könnte man die ersten 2 Bytes "richtig" auslesen?
Delphi-Quellcode:
var
FileHandle: Integer; Buffer : Word; begin FileHandle := FileOpen(Picture, fmOpenRead); FileSeek(FileHandle, 0, 0); FileRead(FileHandle, Buffer, 2); FileClose(FileHandle); case Buffer of $4D42: Result := pw_BMP; $D8FF: Result := pw_JPG; $5089: Result := pw_PNG; else Result := pw_None; end; |
AW: Bytes im Word drehen
Swap ->
![]() oder vielleicht auch
Delphi-Quellcode:
case Buffer of
$424D: Result := pw_BMP; $FFD8: Result := pw_JPG; $8950: Result := pw_PNG; else Result := pw_None; end; |
AW: Bytes im Word drehen
Die x86-Architektur speichert Integer und seine Derivate (so auch Word) im LSB-Format. Das bedeutet, daß das am wenigsten signifikate Byte (LSB) als erstes kommt. Somit wird die Byte-Sequenz $FF,$D8 als ein Word $D8FF interpretiert. Analog gilt das natürlich auch für größere Integer-Typen.
Du musst bei der Angabe der Word-Werte in der case-Anweisung dies berücksichtigen. Eine Bitmap-Datei beginnt z.B. mit der Byte-Sequenz $42, $4D (was übrigens den ASCII-Buchstaben "BM" entspricht). Wenn du diese zwei Bytes als Word interpretierst, dann wird das als $4D42 = 19778 eingelesen. Eigentlich musst du somit gar nichts an deinem Code ändern. Die case-Anweisung sollte funktionieren. |
AW: Bytes im Word drehen
Ich musste neulich auch einmal die Endianess von einem Word ändern, habe mich aber vor System.Swap(..) gefürchtet: Die Doku spricht von Word (2Byte), die Signatur von einem Integer (4Byte).
Echte Delphi-Graurücken schütteln sich da wahrscheinlich das passende Assembler-Kommando aus dem Ärmel, aber ich habe mir (manch einer wird wohl lachen) den hier gemacht:
Delphi-Quellcode:
Weil ich sonst einfach nichts besseres gefunden habe. Eigentlich sollte so etwas in den Helferklassen für simple Typen drinstecken. Finde ich.
TWordHelper = record helper for System.Word
/// <summary> /// Vertauscht beide Bytes /// </summary> public procedure flipEndianess(); end; procedure TWordHelper.flipEndianess(); var firstBytePtr, secondBytePtr: PByte; firstByteValue: Byte; begin firstBytePtr := Addr(self); secondBytePtr := firstBytePtr + 1; firstByteValue := firstBytePtr^; firstBytePtr^ := secondBytePtr^; secondBytePtr^ := firstByteValue; end; |
AW: Bytes im Word drehen
Warum Buffer:WORD, nimm Buffer:BYTE.
FileRead liest Byte-weise. |
AW: Bytes im Word drehen
Wenn man Word braucht, wieso dann Byte nehmen? Und wie ich die Hilfe verstehe, liest FileRead blockweise, deshalb der Count-Parameter.
|
AW: Bytes im Word drehen
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Bytes im Word drehen
Zitat:
CU, der Pølser |
AW: Bytes im Word drehen
Zitat:
1. Sind die Bytes nicht immer am Anfang 2. können es auch mehr sein, z.B. 4 Bytes... |
AW: Bytes im Word drehen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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 by Thomas Breitkreuz