iOS 关于大小端以及一些数据补位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 关于大小端以及一些数据补位相关的知识,希望对你有一定的参考价值。

参考技术A 所谓大端数据就是数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

所谓的小端数据就是数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。(简单的来说就是反过来存放数据了)

数据补位,是指在将数据按照8个字节一段进行加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节(通常补00或者FF,根据实际要求不同)进行计算,之后按照顺序将计算所得的数据连在一起即可。

假设要发送一段这样的数据(16进制数据):

这段数据的内容大概是包含了:我有一个头部标记,然后用头部之后的两个字节作为描述何种命令的长度,然后接上的是何种命令,然后接上了附带信息的长度(4个字节),然后是附带信息。

需要发送的信息为:**| https(头部) | len | openStream | len2 | @"速度与激情.h264",@"fileName" **

最后打印出的Data,就是对应数据的16进制标准格式了。

其实还有一些可优化的地方,仔细的观察下每次的Data组装,然后你就会发现NSData本来就已经是16进制的,而大小端的转换其实还有跟简单的转换比方说是这种:

这里写成这样完全是方便理解、

关于大小端问题和字节序问题的一些总结


1、大小端是不同的对于数据在内存地址中的存放方式,不同的处理器(平台)的数据存储方式是不同。的如果
实现跨平台通信则大小端是不能忽视的问题。
大端模式:数据的高位存储在内存的低字节。ARM/PowerPC等处理器采用大端模式
小端模式:数据的地位存储在内存的低字节。Intel架构处理器采用小端模式。
如一个数据:0x12345678;对应内纯地址是0x00~0x03。
大端模式: 小端模式:
地址:0x00 0x01 0x02 0x03 地址:0x00 0x01 0x02 0x03
数据:0x12 0x34 0x56 0x78 数据:0x78 0x56 0x34 0x12
2、字节序对应着内存的存储(组织)模式,如网络字节序采用大端模式。
3、字节序只是对内置的数据类型而言(int、short、double、long....char)而对于char而言由于其本身只有一个
字节则字节序和存储模式对其不影响。(因此字符串在跨平台传输时不用考虑字节序)
4、单字节内纯中的比特为不受字节序的影响,大于1个字节的数据类型,字节序才对其有影响。
引申:网络通讯中字节序的影响。
在网络通讯中对端口和IP地址进行了字节序的转换而未对发送的数据进行字节序的转换的一些思考:
对于同平台的网络通信而言发送的数据是不需要进行字节类型转换的,字节始终是以二进制的形式存放不管是在何种
平台下都是1个字节8个BIT,而字节序所影响的只是对我们的读取数据的影响,如果在同一平台下通讯则字节序不会对
我们的读取有影响。如在进行网络通信是网络只是数据的传输介质而不需要对数据进行解读,对数据进行解读的是我们
数据的接收方。所以在同平台中的网络通信中不必要对传输的数据进字节序的转换。当然跨平台中进行通信时是需要对
数据的字节序进行转换的(可以在接收方也可以在发送方)。
在基于TCP/UDP进行网络通信时对端口和IP地址进行的字节转换只是在网络通信中这两个数据是给网络通信的数据
只有经过字节序转换之后网络中的协议等才能够识别我们的数据。(个人认为如果在网络通信中通信两端都不进行端口或IP)
的字节序转换时通信也是能够完成的只是此时网络中识别的端口和IP和我们实际想设定的端口和IP是不一致的)。

以上是关于iOS 关于大小端以及一些数据补位的主要内容,如果未能解决你的问题,请参考以下文章

关于大小端转换整理总结(包含原始方式Qt方式)

关于大小端转换整理总结(包含原始方式Qt方式)

关于大小端转换整理总结(包含原始方式Qt方式)

C/C++ 关于大小端模式

4字节十六进制数据和大小端传输

linux kernel 如何处理大小端