2016-07-20 31 views
-1

Ich ging gerade durch einen der Java-Code, wo sie einen der Code für GetBigEndian Funktion für eine bestimmte Länge verwendet. Unten ist der Code, der für JAVA ist:Wie würde die Get Big Endian-Funktion in Objective C aussehen?

// JAVA 
public static byte[] getBigEndian32(int length) { 
    byte[] res = new byte[4]; 
    res[0] = (byte) (length >>> 24); 
    res[1] = (byte) ((length >>> 16) & 0xFF); 
    res[2] = (byte) ((length >>> 8) & 0xFF); 
    res[3] = (byte) (length & 0xFF); 
    return res; 
} 

Was diese Funktion sieht wie in Objective C wäre? Ich versuchte unter Lösungen, aber gab mir nicht die genaue Ausgabe, die oben genannte Funktion zurückkehrt.

// Tried Solution 1: 
NSMutableData *data = [NSMutableData data]; 
[data appendBytes:(const void *)(length >> 24) length:4]; 
[data appendBytes:(const void *)(length >> 16 & 0xFF) length:4]; 
[data appendBytes:(const void *)(length >> 8 & 0xFF) length:4]; 
[data appendBytes:(const void *)(length & 0xFF) length:4]; 

Der obige Code stürzte in der 2. Zeile ab. Keine hilfreich Protokolle :(

// Tried Solution 2: 
int convert(int num) 
{ 
    int b0,b1,b2,b3; 
    b0= (num & 0x000000FF)>>0; 
    b1= (num & 0x0000FF00)>>8; 
    b2= (num & 0x00FF0000)>>16; 
    b3= (num & 0xFF000000)>>24; 

    num= (b0<<24) | (b1<<16) | (b2<<8) | (b3<<0) ; 

    return num; 
} 

Above Lösung ist aus: Convert Little Endian to Big Endian

auch durch Bit conversion tool in Objective-C gegangen Dies auch nicht helfen

mir jeden Hinweis oder eine Idee, wie Let zu konvertieren.. dieser Java-Code zu Objective-C-Code. Vielen Dank im Voraus.

+0

Welches Problem versuchen Sie zu lösen? Hierfür stehen bereits verschiedene Funktionen zur Verfügung. Ist das nur eine Lernübung? – Avi

+0

Was ist falsch an Lösung # 2? Es gibt auch 'CFSwapInt32HostToBig()' und 'htonl()', die denselben Zweck erfüllen. –

+0

@MartinR Mit # 2 mindestens seit AND ist erste und Variable ist signiert das Zeichen wird in der letzten erweitert werden. Sollte zuerst verschoben werden UND zuletzt. In der ursprünglichen SO-Antwort sind die Variablen nicht signiert, so dass es funktioniert. –

Antwort

2

Ihr Code nicht in Bigendian Byte-Reihenfolge konvertieren. Es tauscht die Bytes. So wird Bigendian zu LittleEndian und umgekehrt, was bedeutet, dass ich Bei einem Bigendian-Prozessor ist das völlig falsch.

CFSwapInt32HostToBig macht genau das, was Sie brauchen: Drehen Sie eine Zahl in das BigEndian-Format. Egal, was Ihr Prozessor ist. htnl() macht dasselbe auf eine portablere Weise, außer dass es "Host zur Netzwerk-Byte-Reihenfolge" bedeutet, und die Netzwerk-Byte-Reihenfolge ist Bigendian. Dann können Sie diese Nummer zu den NSData hinzufügen.