Bytes und Bits einlesen und High-Loxbyte tauschen
-
Hallo,
nutze den Borlan c++ Builder 2006 und habe eine Frage zum einlesen von einer Datei.
Die Datei befindet sich im gleichenOrdner wie die zu kompilierenden Quelltextdaten. Meine Frage ist nun, wie ich aus einer Datei einzellne Bytes lesen kann und das Low- und Highbyte tauschen kann, um später diesen Wert wieder als Variable zu sichern.
Danach muss ich das nochmal für gewisse Bits machen. Wobei hier natürlich kein Low- und Highbyte vertauscht werden muss. Wie geht das? Gibt es dafür einen Quellext. Wie ist das bei double-Werten.
Problem ist die Konvertierung der Zahlen von Motoroler Prozessoren zu Intel Prozessoren.
Bitte helft mir.
-
Du kannst die Datei per fopen() öffnen und mit fread() byteweise (oder auch in größeren Blöcken) einlesen.
(bitweise Einlesen geht nicht - aber du kannst ein Byte nachträglich "auseinandernehmen")Wie ist das bei double-Werten.
Problem ist die Konvertierung der Zahlen von Motoroler Prozessoren zu Intel Prozessoren.Ob die Datendarstellung kompatibel ist, bin ich mir nicht sicher - eventuell hast du ja Glück
-
Es gibt den Assembler-Befehl bswap (32bit Register), der vertauscht die Bytes von Intel- nach Motorolla-Format und umgedreht.
_asm mov eax, variable
_asm bswap eax
_asm mov variable, eax
Du kannst natürlich auch einen auf Schieber-Max machen:var = (var << 24) | (var >> 24) | ((var & 0xff00) << 8) | ((var & 0xff0000) >> 8);
-
Danke euch,
leider kann ich nicht sagen ob das bei double Werten auch so funktioniert.
-
Nein, das geht mit Fließkommazahlen nicht (direkt). Du müsstest dir, um die Bitoperationen auf Fließkommazahlen anwenden zu können, von hinten durch's Knie in den Kopf schiessen. Und von hinten durch's Knie in den Kopf schiessen ist in der Regel nicht portabel.
Besser wäre es eine allgemeine Funktion zum Umkehren der Byteorder zu definieren, die unabhängig vom Datentyp arbeitet.
Die Funktion könnte z.B. so aussehen:
void byteorderbla(void *data, size_t len){ // hier die einzelnen Bytes tauschen // Tipp: data nach (char*) casten }
Wobei data ein Zeiger auf die Variable wäre und len die Größe der Variable in Bytes.
Aufruf wäre dann z.B.:
double g = 9.81; byteorderbla( &g, sizeof(g));
-
double - little endian nach big endian müsste so gehen:
void swapdbl(void* dbl) { long long* bitfeld = (long long*) dbl; *bitfeld = ((*bitfeld & 0x000000ff000000ff) << 24) | ((*bitfeld & 0xff000000ff000000) >> 24) | ((*bitfeld & 0xff000000ff00) << 8) | ((*bitfeld & 0xff000000ff0000) >> 8); } int main() { double real = 0.010203040102030400; swapdbl(&real); //ins Motorola-Format swapdbl(&real); //zurück ins Intel-Format return 0; }