当按网络字节顺序放置双精度数时,为什么它以 4 字节块的形式完成?

When putting a double in network byte order, why is it done in 4 byte chunks?

在大端和小端之间转换网络数据时,我的理解是我们交换了构成该类型的所有字节。无论类型的大小如何,我们都会交换它们,以便第一个字节成为最后一个字节,最后一个字节成为第一个字节。
这可以用下面的函数一般地表示:

void SwapBytes(void *pv, size_t n)
{
    char *p = pv;
    size_t lo, hi;
    for(lo=0, hi=n-1; hi>lo; lo++, hi--)
    {
        char tmp=p[lo];
        p[lo] = p[hi];
        p[hi] = tmp;
    }
}

不考虑效率,
我曾希望这适用于任何数据类型——包括 IEEE 754 双精度数据类型。


然后,我遇到了following post
用户在 4 字节块中交换了 double 的字节:

void send_double(double d) {
    long int i64 = *((reinterpret_cast<int *>)(&d)); /* Ugly, but works */
    int hiword = htonl(static_cast<int>(i64 >> 32));
    send(hiword);
    int loword = htonl(static_cast<int>(i64));
    send(loword);
}

double recv_double() {
    int hiword = ntohl(recv_int());
    int loword = ntohl(recv_int());
    long int i64 = (((static_cast<long int>) hiword) << 32) | loword;
    return *((reinterpret_cast<double *>(&i64));
}

在网络字节序方面有什么特殊规定吗?
起初,我认为这是一次交换 4 个字节,无论类型如何,但这对于只有 2 个字节的 uint16 没有意义。

将 IEEE 754 double 转换为网络字节顺序的正确方法是什么?
我是翻转所有 8 个字节,还是单独翻转每一半?

What is the correct way to convert a IEEE 754 double into network byte order?

据我所知,IEEE754 double 没有标准的网络字节顺序。显然人们已经推出了自己的连载。

“网络字节顺序”最初是在 Internet 协议的上下文中产生的,其中通常发送 32 位值(IPv4 地址)和 16 位值(例如端口号)。 RFC 1700 originally defined the term, but that RFC is now obsoleted 无替换。


对于 double 或与此相关的任何其他数据的通信,两端应同意并遵循 协议规范 。这将说明 double 是如何编码的。您链接到的 post 大概遵循了一个协议,该协议指定按照他显示的特定顺序放置 IEEE754 64 位格式的字节。其他协议可能不同。