5

我想通过网络发送一些双精度浮点数。(标准 C,标准套接字)没有 htond 或 ntohd 将数据与网络字节顺序进行转换。我该怎么办?我脑子里有几个解决方案,但我想知道常见的做法是什么。

(我也想知道发送 64 位整数的常见做法是什么,比如 gstreamer 使用的 gint64 值)

编辑:这是我想到的一种解决方案。我认为它适用于任何大小的整数,但它适用于双精度数吗?

void swap_if_necessary (void* buff, int buff_len) 
{
    uint32_t foo = 1;
    if ( htonl(foo) != foo ) 
    {
        char* to_swap = (char*)buff;

        int i;
        for (i = 0; i < buff_len/2; i++)
        {
            char  swap_buff = to_swap[i];
            to_swap[i] = to_swap[buff_len -1 -i];  
            to_swap[buff_len -1 -i] = swap_buff;
        }  
    }
}
4

3 回答 3

10

将其转换为约定的字符串格式并发送。不确定这是否是常见的做法,甚至是体面的,但它对我有用(确实,我当时并不关心性能,因为我没有发送很多值)。

于 2011-05-21T20:32:58.273 回答
5

Andre 的意思是,由于不同计算机体系结构之间的差异,二进制浮点数在网络中是不可信的。超出字节顺序(大/小端)的差异。因此,如果您的数据有可能被不同的计算机体系结构处理,那么转换为字符串或使用诸如 XDR 之类的库之类的事情是非常必要的。

整数和字符的简单格式只需调整字节序即可顺利通过,但浮点变得更加复杂。

于 2011-05-21T21:38:59.313 回答
4

您可能想查看最初在rfc1014中定义的XDR。显然,您想找到一个为您的平台实现 XDR 的库。

于 2011-05-21T20:32:14.160 回答