将little-endian系统中的数据转换为网络字节顺序所需的基础转换是什么?对于2字节和4字节数据,有众所周知的函数(如htons,ntohl等)来封装更改,1字节数据字符串(如果有的话)会发生什么?
此外,维基百科暗示little-endian是big-endian的镜像,但如果这是真的,为什么我们需要对2字节和4字节数据进行特定处理?
文章"关于圣战和和平辩护"似乎意味着有许多不同口味的小端 - 这是一篇古老的文章 - 它仍然适用吗?是否仍然需要像Java类文件开头那样的字节顺序标记?
最后,网络字节顺序需要4字节对齐吗?
假设你在b
字节数组中有ASCII文本"BigE" .
b[0] == 'B' b[1] == 'i' b[2] == 'g' b[3] == 'E'
这也是字符串的网络顺序.
如果它被视为32位整数,那就是
'B' + ('i' << 8) + ('g' << 16) + ('E' << 24)
在一个小端平台和
'E' + ('g' << 8) + ('i' << 16) + ('B' << 24)
在一个大端平台上.
如果你单独转换每个16位工作,你就不会得到这些工作
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24)
这就是为什么ntohl
并且ntohs
都是必需的.
换句话说,ntohs
交换16位短的字节,并ntohl
反转其32位字的四个字节的顺序.