2016-11-08 21 views
1

私は使用したい4バイトのデータ(unsigned intとして格納されている)を持っています。バッファをunsigned intに変換し、ビットマスクを使用する

これは1バイトのデータである場合、これは使用して解決されている:

//Java 

buffer.getInt() & 0xFFFFFFFFL 

//Current not working Objective-C code 
uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 4)]; 
uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 
//data: 0103940f b7626361 
//buffer = 1656164244; payloadLength: 2484057954 (should be = ~80) 

をObjective-について:

//Java 

buffer.get() & 0xFF 

//Objective-C 

uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 1)]; 
uint32_t payloadLength = buffer & 0xFFu; 
//data = d1021b53 
//buffer = 897307; payloadLength: 27 

ジャワ、で4バイトため、これは使用して行われていますC/C、4バイトとビットマスクで作業するのが難しいです。

誰でもこれに関する助けがありますか?

答えて

1

4バイトを整数に変換するには、1バイトコードと似たようなことができますが、エンディアンの順序に対処する必要があります。つまり、4バイトの周りにどのように格納するかを知る必要があります最初のバイト。

だから、4バイトのバッファを起動します。

uint32_t buffer; // or use int32_t if signed 

コピーバイト:

[data getBytes:&buffer range:NSMakeRange(0, 4)]; 

とホスト順にバイトの順番を変換します。データはビッグエンディアンである場合に実行します。

uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 

またはそのリトルエンディアンの場合:

uint32_t payloadLength = CFSwapInt32LittleToHost(buffer); 

と設定が完了しています。

+0

私はこれを使って喜んでいませんでした。私は、符号なし整数を使用するように目的を変更することを反映するようにオリジナルを変更しました。 CFSwapInt32BigToHost(またはLittle)を4バイト値で使用しようとすると、結果がわかりません。上記の1バイトの例でも、それを使用しても動作しません。 java 0xFFFFFFFFビットマスクを複製する方法に関するその他の提案はありますか? –

+0

この場合、ビットマスクを使用する必要はありません。あなたはあなたの質問を編集することができます(コメント内のコードを置くことは実際には機能しません)。この答えに基づいて現在持っているコードを表示し、 'NSLog(@"%@ \ n%8x \ n%8x "、data、buffer、payloadLength)'? (データが長い場合は、 'data'のダンプの一部を取り除いてください!) – CRD

+0

私は、例の値を表示するために投稿を編集しました。 –

関連する問題