什么样的转变被用于通过little-endian系统转换数据网络的订单?
-
19-08-2019 - |
题
什么是潜在的转变,是必要的转换成数据在little-endian系统进入网络字节了?2字和4个字节的数据有众所周知的功能(例如htons,ntohl,等等。) 封装的变化,什么样的事情发生串的1字节的数据(如果有的话)?
此外,维基百科,意味着little-endian是镜像big-endian,但如果这是真的,为什么我们需要具体处理用2和4个字节的数据?
论文"在圣战,并呼吁和平"似乎意味着有许多不同的口味的little-endian--这是一个古老的文章--这是否仍然适用吗?是字节以标记像那些发现在开始Java类文件仍有必要吗?
最后4字节的准的必要网络字节了?
解决方案
让我们假设你有一个字节数组b
的ASCII文本“璧合”。
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位字的顺序。
其他提示
具体处理功能采取的一个事实,即有,关于特定数据大小操作的处理器指令的优点。运行1个字节的反向功能四倍肯定比使用更宽的指令同时执行对所有四个字节是相同的(尽管是在规模扩大)操作效率较低。
1字节数据不要求endians之间的任何变换(它的过UTF-16和用于字符串编码UTF-32 UTF-8的优点)。
是4字节对齐所必需的网络字节顺序?
没有特定对准是必要的字节去在一个网络。你的处理器可要求一定的排列在内存中,但它是由你来解决这一差异。 x86家族通常不作这样的要求。
基本的想法是,所有multi-byte类型已经有了他们的字节逆转。一个四字节的整数会有字节的0到3换,并字节1和2的交换。两整数字会有字节0和1的交换。一个字节的文字未获得交换。
有两个 非常重要的 影响非practicioners和新手不会总是意识到:
- (ASCII码)的字符串都没有触及。
- 那里是 没有 可能盲目的算法来字交换的通用的"数据"。你必须知道是什么类型的所有数据和交换的各项要求的方式用于其类型。