同一个数值可以有不同字节排列
十进制1023写成两字节十六进制数值为0x03FF。按大端顺序存放是03、FF,小端则是FF、03;两种约定表示的数值相同,接收者却必须知道应采用哪种解释。看到两个字节本身,不能忽略字段格式就确定它代表的数。
“先”在内存中通常指较低地址,在文件中指较早偏移。单字节字段内部没有多个字节可交换,多个字段之间的排列又由格式规定。把整条记录反转,会把字段位置也改变,通常不是正确的大小端转换。
参考:[1]
交换格式要明确自己的约定
一个文件或协议可以规定固定顺序,或者在头部标明编码。ELF的标识信息区分小端与大端数据解释;程序应先识别这些信息,再解析相应多字节字段,而不能直接套用本机处理器的顺序。
Python的struct以<指定小端、>指定大端,!表示其网络大端格式。这些前缀约束的是所描述字段的表示,并不证明所有网络协议都采用同一种顺序;具体协议仍可能规定不同字段规则,必须按自身格式读取。
字节序、宽度和对齐分开
数值占几字节、字节怎样排序以及字段之间是否插入填充,是三个不同问题。Python struct的@采用本机大小与对齐,=仍采用本机字节序,却使用标准大小并取消自动对齐;仅说“本机格式”不足以区分这些选择。
序列化时应明确每个字段的类型、宽度、顺序和边界,并与内存对象布局区分。直接复制一份本机结构体可能带入填充或平台类型差异;即使两台机器碰巧同为小端,也不因此保证整个记录能按同样规则解释。