0

我将数据字节存储在一个数组中。现在,在程序中我使用了 getBytes:range:NSmakeRange(position, length)。当我打印收到的字节时,我认为它们的位置被交换了,我的答案是 0x0292 而不是 0x9202(请查看下面的程序)。

现在,我很困惑哪一个是正确的答案。我真的有必要总是交换我收到的字节吗?请向我解释这个概念,以便我能够清楚地理解。

这是我的代码!!谢谢你。

const Byte dataBytesArray[] = {
    0x92, 0x02, 0x13, 0x14 //in Hex
};

NSData *myDataArray = [[NSData alloc]initWithBytes:dataBytesArray length:4];
uint16_t ef;
[myDataArray getBytes:&ef range:NSMakeRange(0, 2)];

NSLog(@"dataByteArray is %@ ",[NSNumber numberWithUnsignedInteger:ef]);//the answer I got is 658 in decimal format which is 0x0292

uint16_t swapping = CFSwapInt16BigToHost(ef); //swapping the bytes
NSLog(@"swap is %@ ",[NSNumber numberWithUnsignedInteger:swapping]); //after swapping I got 37378 which is 0x9202
4

2 回答 2

1

您是否使用类似的功能CFSwapInt16BigToHost取决于您在两端处理的内容。

如果您的“主机”(运行此代码的机器)可能会有所不同,那么使用众多CFSwap...ToHost功能之一是一个非常好的主意。例如,英特尔 Mac 和 ARM iOS 设备使用不同的字节顺序。PowerPC Mac 和 Intel Mac 使用不同的字节顺序(我认为这是真的)。为了使您的代码在这些不同的环境中安全运行,明智的做法是使用正确的“toHost”函数。

即使您的代码目前只能在一种类型的设备上运行,使用它们来避免在主机的正确顺序上出现任何混淆仍然是明智的。

所以关键的决定是知道在接收到的数据中使用了什么样的字节顺序。如果您知道接收到的数据是大端字节序的,那么请使用正确的“BigToHost”函数。如果您知道接收到的数据是 little-endian bye order 的事实,请使用正确的“LittleToHost”函数。如果您不知道,那么您必须找出答案。

要考虑的另一件事是从您的应用程序发送数据。您应该使用正确的“HostTo”功能。例如,这在 iOS 应用程序中非常重要。您的 iOS 应用程序可以在 ARM iOS 设备上运行,也可以在 Intel Mac 上的模拟器中运行。如果您只是发送主机字节,那么顺序将根据应用程序的运行位置而有所不同。这是不好的。所以应用程序应该选择一个订单,然后使用适当的“HostTo”函数将数据转换为所选订单。然后,任何需要读取该数据的代码都可以在使用“ToHost”函数时指定相同的顺序。

于 2013-05-20T15:38:02.660 回答
0

这都是关于字节序的。如果您从网络接收数据,它将是大端。你的机器是小端的,所以在这种情况下你需要交换字节。

见:http ://en.wikipedia.org/wiki/Endianness

于 2013-05-20T14:04:59.303 回答