ios - 当字节通过不同的平台时,如何使字节按正确的顺序排列?

标签 ios c byte-order-mark mqtt

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

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位)

当另一个应用程序接收到 header 时,它会将 2 个字节的 header 解析为两个 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 我永远无法得到正确的结果,有人可以帮助我吗?

如有任何帮助,我们将不胜感激!

最佳答案

了解serialization .

您可以使用例如htonl(3) ,或endian(3) .

您可以使用XDRRPCGEN ,或ASN.1 .

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

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

关于ios - 当字节通过不同的平台时,如何使字节按正确的顺序排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19987583/

相关文章:

ios - Quickblox:如何删除特定时间段内的用户签到

c - readline() 内部缓冲区

c - glibc - #define void

c - 错误: lvalue required as increment operand

c++ - 为什么字符串有时朝一个方向写,有时朝另一个方向写?

csv - 如何在golang中编写csv时删除<feff> BOM

java - Windows 和 Unix 中的 BOM

ios - 未调用 iOS 回调的 FCM 推送

ios - 在 Metal 计算着色器中使用MPSImageConvolution内核

ios - 自动布局 : Location anchors require being paired 崩溃