当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的

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

本文关键字:字节 网络字节顺序 双精度 为什么      更新时间:2023-10-16

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

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双精度。


然后,我遇到了以下帖子,
其中,用户在 4 字节块中交换了双精度的字节:

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 双精度转换为网络字节顺序的正确方法是什么?
我是翻转所有 8 个字节,还是单独翻转每半字节?

将 IEEE 754 双精度转换为网络字节顺序的正确方法是什么?

据我所知,IEEE754双精度没有标准的网络字节顺序。 显然,人们已经推出了自己的序列化。

"网络字节顺序"最初是在互联网协议的背景下产生的,在互联网协议中,发送32位值(IPv4地址)和16位值(例如端口号)是很常见的。RFC 1700 最初定义了该术语,但该 RFC 现已过时,无法替代。

<小时 />

对于double或任何其他数据的通信,双方应同意并遵循协议规范。这将说明双精度是如何编码的。 您链接到的帖子可能遵循了一个协议,该协议指定将IEEE754 64 位格式的字节按他显示的特定顺序放置。 其他协议可能有所不同。