具有htonl和ntohl函数的pdp endian

时间:2018-08-06 00:05:46

标签: c sockets bit-manipulation endianness

我从here读到,

  

在假设的“愚蠢的字节序” C实现中,其中字节   既不是big-endian(有序4321)也不是little-endian(有序   1234),但以3214为例,您仍然可以   htonl(ntohl(x)),但是htonlntohl不会做同样的事情   事情是相反方向的8位旋转。我希望   没有这样的体系结构,但是它可以实现套接字API   感谢htonlntohl是独立的功能。

但是我无法理解和理解的含义,但是htonlntohl不会做相同的事情,它们是相反方向的8位旋转。如果它们以相反的方式旋转,将会发生什么。函数将在逻辑上表现如何?

您能描述和解释其逻辑吗?

P.S。这意味着在这种情况下,htonlntohl函数的实现是不同的,并且 htonl(x) != ntohl(x)

1 个答案:

答案 0 :(得分:1)

假设您有一个体系结构,内部将值0x01020304存储为0x04010203ntohl的实现需要将字节右移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;
}