6 Stimmen

Wie kann ich die Byte-Reihenfolge eines NSInteger oder NSUInteger in Objective-C umkehren?

Dies ist gewissermaßen eine Fortsetzung von diese Buchung aber mit einer anderen Frage, so dass ich dachte, ich sollte in einem separaten Thread fragen.

Ich bin an einem Punkt, an dem ich vier aufeinanderfolgende Bytes im Speicher habe, die ich aus einer Datei eingelesen habe. Ich möchte diese als Bit-Array speichern (der tatsächliche int-Wert ist erst später von Bedeutung). Wenn ich ausdrucke, was in meinem int steht, stelle ich fest, dass es in umgekehrter Reihenfolge gespeichert zu sein scheint (Little Endian).

Kennt jemand eine gute Methode, um die Reihenfolge der Bytes umzukehren? Dann einmal umgekehrt, Kommissionierung von aufeinanderfolgenden Bits, die zwei Bytes und zurück zu einem int konvertieren?

unsigned char data[] = { 0x00, 0x02, 0x45, 0x28 };
NSInteger intData = *((NSInteger *)data);

NSLog(@"data:%08x", intData); // data:28450200

16voto

Sven Punkte 22195

Cocoa (oder genauer gesagt das Foundation-Framework) verfügt über Funktionen zum Vertauschen der Endianness von Bytes: NSSwapInt , NSSwapShort , NSSwapLong y NSSwapLongLong . Diese vertauschen die Bytes, egal was passiert - sie machen Big-Endian-Ganzzahlen aus Small-Endian-Ganzzahlen und umgekehrt.

Wenn Sie wissen, welches Format Sie haben, gibt es andere Funktionen, die es in die native Endianness umwandeln: NSSwapLittleIntToHost y NSSwapBigIntToHost . Es gibt auch die umgekehrten Funktionen, die das native Format in das Little- oder Big-Endian-Format umwandeln: NSSwapHostIntToLittle y NSSwapHostIntToBig . Diese sind auch für die anderen Ganzzahl- und Fließkommatypen verfügbar. Sie rufen bei Bedarf die primitiven Tauschfunktionen für die Werte auf. Also NSSwapLittleIntToHost nichts tut, während NSSwapBigIntToHost gibt das Ergebnis von NSSwapInt auf einem Little-Endian-Rechner.

Beachten Sie, dass diese Parameter die Integer-Typen des Compilers annehmen und nicht die NSInteger Art. Je nachdem, ob Sie 32bit- oder 64bit-Code generieren, müssen Sie also unterschiedliche Funktionen verwenden, wenn Sie NSInteger .

Sie sollten auch nicht Ihr Byte-Array in einen Integer-Zeiger umwandeln und diesen dereferenzieren. Es wäre besser, die Ganzzahl mithilfe von Bitverschiebungsoperationen zusammenzusetzen. Ihr Code wird nur funktionieren, wenn NSInteger ist 32 Bit breit. Wenn er 64 Bit breit ist, wird Ihre Zahl Müll sein oder Ihr Programm könnte sogar abstürzen. Aber auch wenn Sie einen Integer-Typ verwenden, der immer 32 Bit breit ist ( int32_t aus dem C99 <stdint.h> Kopfzeile zum Beispiel) funktioniert dies möglicherweise nicht wie erwartet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X