2

ちょっと私は完全に私の深さから外れていて、私の脳は傷つき始めています.. :(

3バイト配列に収まるように整数を変換する必要があります(これは24ビット整数ですか?)そして、ソケットを介してバイトストリームからこの数値を送受信するために再度戻ります。

私は持っています:

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が実際に正しく変換されたことを確認する方法がわからないことだと思います。これは、データを送信するためにも必要な変換です。

どんな助けでも大歓迎です!

4

3 に答える 3

6

32ビット整数があると仮定します。下位24ビットをバイト配列に配置する必要があります。

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;

3バイトを整数に戻すには:

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

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

于 2010-12-07T15:35:59.033 に答える
1

ユニオンを使用できます。

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

intからbytesに変換するには:

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

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

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など)で機能します。

于 2010-12-07T15:45:54.483 に答える
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

これを本番コードで使用する場合は、おそらく注意が必要なことがありますが、基本的な考え方は正気です。

于 2010-12-07T15:28:08.100 に答える