传输指定的大端序
看了许多文章都不能够简短的进行解释,自己琢磨了下进行分享。
大端序:高位在低地址,这符合人类读写逻辑,例如字符串/文本,从左到右,char data[128] = “123456”
小端序:地位在低地址,这符合电路读取顺序,例如 int 64位,地位在低地址,电路将 int 的存储数据由小到高进行数据合成,这个读取顺序刚好与我们相反。
我们在编程的时候,对于文本和字符串的写入,本身就是头部/高位从低地址开始写,相当于大端序的写入/读取逻辑,这就使得文本/字符串等写入逻辑对于电路的读取逻辑十分方便。
但是,数值型 int 的写入/读取逻辑又是相反的,为使得这种逻辑统一,就规范使用网络大端序。即传输的数据统一为高位在前,地位在后。 否则,会出现传输数据同时带有两种端序(数值小端,其它大端)。
示例: 数值 0x123456 与 字符串"0x123456"
统一大端序:0x12 0x34 0x56 和 ‘0’ ‘x’ ‘1’ ‘2’ ‘3’ …
不统一: 0x56 0x34 0x12 和 ‘0’ ‘x’ ‘1’ ‘2’ ‘3’ …
PS:进行大端序转换主要是方便我们传输的数据进行解读。 到了计算机进行解读时,还是得将数值转为小端序,让计算机进行解析
协议指定的大端序问题
这个需要根据具体协议进行调整,而且必须调整。一般指的是字节内部的比特表示顺序。
例如 某字节内部比特位的信息可表示为:(注意:一般都是采用默认小端位序)
a1 a2 a3
0-2 3-4 5-7
在大端序表示下,还需调整为:(注意:不是一个一个比特位的调换,而是表示位的调换,否则就是大端位序了)
a3 a2 a1
5-7 3-4 0-2
调整后,到了网卡传输都是采用小端位序发送比特,即调整后是怎么样,接收的就是怎么样。
结论
大端序传输是大家都应该采用的,便于抓包等的调试分析。
比特位内部的端序问题是根据协议设定的。
以上所述内容,均针对小端机作为发送方情况下进行大端序转换。