2010-12-07 10 views
2

私は完全に自分の深みの中で、私の脳は傷つき始めています。:(24ビット整数を3バイト配列に変換するにはどうすればよいですか?

3バイト配列に収まるように整数を変換する必要がありますその後、再び、私が持っているソケット

を通じてバイトストリームからこの番号を受信/送信するには:私は私の主な問題は、私は私が実際に私を転換していることを確認する方法がわからないということだと思い

NSMutableData* data = [NSMutableData data]; 

int msg = 125; 

const void *bytes[3]; 

bytes[0] = msg; 
bytes[1] = msg >> 8; 
bytes[2] = msg >> 16; 

[data appendBytes:bytes length:3]; 

NSLog(@"rtn: %d", [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] intValue]); 

//log brings back 0 

intはデータを送信するために必要な変換バックです。

大変助かりました!

答えて

1

あなたは組合使用することができますバイトにint型から変換すること

union convert { 
    int i; 
    unsigned char c[3]; 
}; 

を:

union convert cvt; 
cvt.i = ... 
// now you can use cvt.c[0], cvt.c[1] & cvt.c[2] 

intにバイトから変換するには:

union convert cvt; 
cvt.i = 0; // to clear the high byte 
cvt.c[0] = ... 
cvt.c[1] = ... 
cvt.c[2] = ... 
// now you can use cvt.i 

注:で労働組合を使用してこの方法は、プロセッサバイトオーダーに依存する。私が与えた例は、x86のようなスモール・エンディアン・システムで動作します。

+0

これは素晴らしいです...警告はありますか? – loststudent

0

ポインタトリッキーはどうですか?

int foo = 1 + 2*256 + 3*65536; 
const char *bytes = (const char*) &foo; 
printf("%i %i %i\n", bytes[0], bytes[1], bytes[2]); // 1 2 3 

は、おそらくあなたは、生産コードでこれを使用しようとしている場合、の世話をする事がありますが、基本的な考え方は正気です。

6

32ビット整数があるとします。バック整数に3つのバイトを変換するには

int msg = 125; 
byte* bytes = // allocated some way 

// Shift each byte into the low-order position and mask it off 
bytes[0] = msg & 0xff; 
bytes[1] = (msg >> 8) & 0xff; 
bytes[2] = (msg >> 16) & 0xff; 

:あなたはバイト配列に入れて底部24ビットたい

// Shift each byte to its proper position and OR it into the integer. 
int msg = ((int)bytes[2]) << 16; 
msg |= ((int)bytes[1]) << 8; 
msg |= bytes[0]; 

をそして、はい、私はより最適ながあることを十分に承知していますそれを行う方法。上記の目標は明確です。

+0

+1それは良いエンディアンです。 – JeremyP

+0

これは、数値が<255であれば問題なく動作します.24ビット整数の最大値を集計しますか? – loststudent

+0

@loststudent:いいえ、24ビットの符号なし整数の最大値は(2^24)-1、つまり16,777,216です。符号付き24ビット整数の範囲は-8,388,608〜8,388,607です。どの部分が機能していないのですか? –

関連する問題