在网络字节顺序中加倍时,为什么要用4字节块完成?

时间:2016-04-27 02:07:23

标签: c++ double endianness

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

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字节块中交换双字节的字节:

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个字节,还是单独翻转每个字节?

1 个答案:

答案 0 :(得分:1)

  

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

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

“网络字节顺序”最初是在Internet协议的上下文中出现的,其中通常发送32位值(IPv4地址)和16位值(例如端口号)。 RFC 1700最初定义了该术语,但该RFC现在是obsoleted,没有替换。

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