2016-07-20 5 views
-1

私はちょうど彼らが与えられた長さのためのgetBigEndian関数のコードの1つを使用していたJavaコードの1つを通過していました。以下は、JAVAのためのコードは次のとおりです。Get Big Endian関数はObjective Cのようになりますか?

// 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; 
} 

この機能だろう何のObjective C中のように見えますか?私はソリューションの下で試してみましたが、上記の関数が返す正確な出力を私に与えていませんでした。

// 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]; 

上記のコードは2行目でクラッシュしていました。いいえ役立つログません:(

// 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; 
} 

ソリューション上からです。 もBit conversion tool in Objective-CConvert Little Endian to Big Endian

これも助けにはならなかった

を私に変換する方法上の任意のヒントやアイデアを持ってみましょう。このJavaコードをObjective Cコードに変換してください。

+0

あなたはどのような問題を解決しようとしていますか?これにはすでにさまざまな機能があります。これはちょうど学習の練習ですか? – Avi

+0

解決策2について何が間違っていますか?同様の目的を果たす 'CFSwapInt32HostToBig()'と 'htonl()'もあります。 –

+0

@MartinR少なくともANDが最初で変数が符号付きであるので少なくとも#2は符号が最後のものに拡張されます。最初にシフトし、最後にする必要があります。元のSO答えでは、変数は無署名なので、正常に動作します。 –

答えて

2

あなたのコードはBigendianのバイトオーダーに変換されないので、BigendianをLitt​​leEndianに変換します。 Bigendianプロセッサでは完全に間違っています。

CFSwapInt32HostToBigは、あなたが必要とするものを正確に実行します。数字をBigEndian形式に変換します。あなたのプロセッサーが何であっても。 htnl()は、 "host to network byte order"を意味し、ネットワークバイトオーダーはBigendianであることを除いて、より移植性のある方法で同じことをします。次に、その番号をNSDataに追加することができます。

関連する問題