gpt4 book ai didi

sockets - 什么时候htonl(x)!= ntohl(x)? (或者当在同一台计算机上与网络字节顺序之间来回转换不相等时?)

转载 作者:行者123 更新时间:2023-12-04 03:33:20 25 4
gpt4 key购买 nike

关于htonlntohl。这两行代码中的任何一行何时将计算为false。

 htonl(x) == ntohl(x);

htonl(ntohl(x)) == htonl(htonl(x));

换句话说,这两个操作什么时候在同一台机器上不是等效的 ?我能想到的唯一情形是一台机器不能以2的补数表示整数。

原因是出于历史原因,出于代码清晰性还是出于其他原因?

今天是否存在任何现代架构或环境,它们在同一台机器上在网络字节顺序之间来回转换与在任何方向上的代码都不相同?

最佳答案

多年前,我为UNIVAC 1100系列大型机编写了TCP/IP堆栈。这是具有1的补码算术的36位字可寻址计算机体系结构。

当 native 进行通信I/O时,来自外部世界的8位字节将被放入每个9位四分之一字的低8位。因此,在此系统上,ntohl()会将每个四分之一字中的8位压缩为该字的低32位(前4位为零),因此您可以对其进行算术运算。

同样,htonl()将占用一个字的低32位,并取消此操作以将每个8位的数量放入每个9位四分之一字的低8位。

因此,为了回答最初的问题,此计算机体系结构上的ntohl()和htonl()操作彼此非常不同。

例如:

COMP*                                 . COMPRESS A WORD
LSSL A0,36 . CLEAR OUT A0
LSSL A1,1 . THROW AWAY TOP BIT
LDSL A0,8 . GET 8 GOOD ONE'S
LSSL A1,1 .
LDSL A0,8 .
LSSL A1,1 .
LDSL A0,8 .
LSSL A1,1 .
LDSL A0,8 .
J 0,X9 .
.
DCOMP* . DECOMPRESS A WORD
LSSL A0,36 . CLEAR A0
LSSL A1,4 . THROW OUT NOISE
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
LSSL A0,1 . ADD 1 NOISE BIT
LDSL A0,8 . MOVE 8 GOOD BITS
J 0,X9 .

COMP等效于ntohl(),DCOMP等效于htonl()。对于那些不熟悉UNIVAC 1100汇编代码的人:-) LSSL是“左单移位逻辑”寄存器,具有许多位置。 LDSL按指定的计数是一对寄存器“左双移位逻辑”。因此,LDSL A0,8将连接的A0,A1寄存器左移8位,将A1的高8位移位到A0的低8位。

这段代码是1981年为UNIVAC 1108编写的。几年后,当我们拥有1100/90并使用C编译器时,我启动了BSD NET/2 TCP/IP实现的端口,并实现了ntohl()和htonl ()以类似的方式。可悲的是,我从未完成那项工作。

如果您想知道为什么某些Internet RFC使用术语“八位字节”,那是因为当今的某些计算机(例如PDP-10,Univacs等)的“字节”不是8位。 “八位位组”专门定义为8位字节。

关于sockets - 什么时候htonl(x)!= ntohl(x)? (或者当在同一台计算机上与网络字节顺序之间来回转换不相等时?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com