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 转换为字节:

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

注意:以这种方式使用联合依赖于处理器字节顺序。我给出的示例适用于 little-endian 系统(如 x86)。

于 2010-12-07T15:45:54.483 回答
0

How about a bit of pointer trickery?

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

There are probably things to be taken care of, if you are going to use this in production code, but the basic idea is sane.

于 2010-12-07T15:28:08.100 回答