iOS基础之网络字节顺序的转换

前言

前些阶段在简单的网络开发中碰到了如何将传递过来的字节序列指定位置的几个字节转化成值的问题,这篇文章简单的记录了实现的方法

正文

下面一段代码中,dataBuffer是NSMutableData类型,里面存放了一定长度的字节序列。现从position的索引为9的字节开始,将连续的4个字节内容转换成值(这个值是UInt32 sizeof为4字节)。这时候dataIndex的数字还需要转换一下,使用的是ntohl(),得到的数字就是所需要的值了

    UInt32 dataIndex;
    [self.dataBuffer getBytes:&dataIndex range:NSMakeRange(9, sizeof(dataIndex))];
    dataIndex = ntohl(dataIndex);

⚠️important note:ntohl是将网络传递过来的字节序列中的4个字节的内容转换成数值,而thons是将 网络传递过来的字节序列中的2个字节的内容转成数值

那么如何将UInt32的值存放到指定的4个字节序列中呢?如下代码通过位运算来实现

    UInt32 blockIndex = (UInt32)self.fileReader.blockIndex;
    blockIndexArray[0] = (blockIndex >> 24) & 0xff;
    blockIndexArray[1] = (blockIndex >> 16) & 0xff;
    blockIndexArray[2] = (blockIndex >> 8) & 0xff;
    blockIndexArray[3] = blockIndex & 0xff;

要对更高字节,比如8字节(64位)进行转换,就要自己写转换的方法了。下面是4字节转换(可直接用ntohl),8字节或更多同理

- (UInt32)endianTransferFor32Bit:(UInt32)origin {
    return ((origin >> 24) & 0xff) | ((origin >> 8) & 0xff00) | ((origin << 8) & 0xff0000) | ((origin << 24) & 0xff000000);
}

参考资料

ios 网络字节顺序的转换HTOS

要读取二进制文件的前两个字节,你可以使用C++的文件输入流(ifstream)来实现。下面是一个简单的示例代码: ```cpp #include <iostream> #include <fstream> int main() { // 打开二进制文件 std::ifstream file("example.bin", std::ios::binary); // 检查文件是否成功打开 if (!file) { std::cout << "无法打开文件" << std::endl; return 1; } // 读取前两个字节 char buffer[2]; file.read(buffer, 2); // 检查读取是否成功 if (!file) { std::cout << "读取文件时发生错误" << std::endl; return 1; } // 将字节转换为整数 int value = (buffer[0] << 8) | (buffer[1] & 0xFF); // 输出结果 std::cout << "前两个字节的值为: " << value << std::endl; // 关闭文件 file.close(); return 0; } ``` 在上面的示例代码中,我们首先使用`ifstream`对象打开了一个名为"example.bin"的二进制文件,并使用`std::ios::binary`标志指示它是一个二进制文件。然后,我们使用`read`方法读取前两个字节,并将其存储在一个字符数组中。接下来,我们将字节转换为整数值,以便进行进一步处理。最后,我们输出结果并关闭文件。 请注意,该示例假设文件中的前两个字节是大端序(Big Endian)的。如果文件采用小端序(Little Endian),则需要相应地调整字节顺序。 确保在使用文件流之前,检查文件是否成功打开,并在读取操作后检查读取是否成功。这样可以避免潜在的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值