【问题标题】:pdp endian with htonl and ntohl functions具有 htonl 和 ntohl 函数的 pdp 字节序
【发布时间】:2019-01-12 21:57:16
【问题描述】:

我从here 那里读到过,

关于一个假设的 "stupid-endian" C 实现,其中字节 既不是大端(订购4321)也不是小端(订购 1234),但是订购了例如3214,你仍然有 htonl(ntohl(x)),但 htonlntohl 不会这样做 事情,它们将是相反方向的 8 位旋转。我希望 不存在这样的架构,但它可以实现套接字 API 感谢htonlntohl 是独立的函数。

但我无法理解和弄清楚 的含义,但 htonlntohl 不会做同样的事情,它们会是相反方向的 8 位旋转。 会是什么如果它们以相反的方式旋转,就会发生。函数的逻辑行为如何?

你能描述和解释它的逻辑吗?

附:这意味着在这种情况下,htonlntohl 函数的实现是不同的,htonl(x) != ntohl(x)

【问题讨论】:

  • 我想强调的是,您的真正问题与 htonl 或 ntohl 无关。您不理解“在任一方向按字节旋转 int”的含义。一旦你挖掘了它,你的具体问题就会自己回答:)

标签: c sockets bit-manipulation endianness


【解决方案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。在结果0x04010203 上调用ntohl 不会返回0x01020304,而是会返回0x03040102

要反转这个过程,您需要将 left 旋转 1 个字节。 htonl 的实现可能如下所示:

uint32_t htonl(uint32_t n)
{
    unsigned char x = (n & 0xff000000) >> 24;
    uint32_t result = n << 8;
    result |= x;
}

【讨论】:

  • 谢谢大佬,你不会写错函数名吧?我的意思是您需要将 htonl 更改为 ntohl ,反之亦然。因为网络字节顺序总是大端的?
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 2012-07-10
  • 2013-03-29
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多