我从here读到,
在假设的“愚蠢的字节序” C实现中,其中字节 既不是big-endian(有序
4321
)也不是little-endian(有序1234
),但以3214
为例,您仍然可以htonl(ntohl(x))
,但是htonl
和ntohl
不会做同样的事情 事情是相反方向的8位旋转。我希望 没有这样的体系结构,但是它可以实现套接字API 感谢htonl
和ntohl
是独立的功能。
但是我无法理解和理解的含义,但是htonl
和ntohl
不会做相同的事情,它们是相反方向的8位旋转。如果它们以相反的方式旋转,将会发生什么。函数将在逻辑上表现如何?
您能描述和解释其逻辑吗?
P.S。这意味着在这种情况下,htonl
和ntohl
函数的实现是不同的,并且 htonl(x) != ntohl(x)
答案 0 :(得分:1)
假设您有一个体系结构,内部将值0x01020304
存储为0x04010203
。 ntohl
的实现需要将字节右移1。
例如:
uint32_t ntohl(uint32_t n)
{
unsigned char x = n & 0xff;
uint32_t result = n >> 8;
result |= x << 24;
}
这会将值0x01020304
转换为0x04010203
。在结果ntohl
上调用0x04010203
不会返回0x01020304
,而是会给您0x03040102
。
要反转此过程,您需要将左旋转1个字节。 htonl
的实现可能看起来像这样:
uint32_t htonl(uint32_t n)
{
unsigned char x = (n & 0xff000000) >> 24;
uint32_t result = n << 8;
result |= x;
}