如何在通过不同平台时将字节输入正确的顺序?

时间:2013-11-14 20:21:42

标签: ios c byte-order-mark mqtt

我正在开发一个通过网络传递字节的应用程序,服务器声明它的字节顺序是Big-Endian。在我的应用程序中,我用一个占用2个字节的标头包装数据,我将字节分配如下:

int length = [self.dataLengthHeader length];
if (length <= 255) {
    high = 0;
    low = length;
}else if (length == 256)
{
    high = 1;
    low = 0;
}else {
    high = length/256;
    low = length%256;
}
Byte byte[] = {high, low};
NSLog(@"%hhu  %hhu", high, low);
NSMutableData *dataToSend = [NSMutableData dataWithBytes:byte length:2];

例如the first byte is 00, the second is 05

第一个字节是00(8位),第二个字节是05(8位)

如果另一个应用程序收到标题,它会解析标题,该标题将2个字节转换为两个int(两个NSInteger会更好)以获取真实消息的信息。

NSData *twoBytes = [NSData dataWithBytes:payloadptr length:2];

NSData *low = [twoBytes subdataWithRange:NSMakeRange(1, 1)];
int lowP;
[low getBytes:&lowP length:sizeof(lowP)];

NSData *high = [twoBytes subdataWithRange:NSMakeRange(0, 1)];
int highP;
[high getBytes:&highP length:sizeof(highP)];

内存快捷方式:the first byte

the second byte

当我注销字节时,结果是这样的:highP = 70074112 lowP = 365573 我永远无法得到正确的结果,任何人都可以帮助我吗?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

了解serialization

你可以自己使用,例如htonl(3)endian(3)

您可以将XDRRPCGENASN.1一起使用。

您可以使用libs11n(在C ++中)。你也可以考虑protocol buffers等......

除非您有大量数据或带宽,否则您可以考虑使用文本序列化格式,如JSON(有些灵活,更容易调试等等)或二进制对应物,如{{3} }。请注意,在网络上发送数据比CPU慢得多,因此文本序列化的开销通常会在噪声中丢失(即使您压缩它)。