主机到网络双?

时间:2011-05-21 20:27:54

标签: c double sockets double-precision htonl

我想通过网络发送一些双精度浮点数。 (标准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;
        }  
    }
}

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

整数和字符的简单格式可以通过字节序调整而滑过,但浮点变得更复杂。

答案 2 :(得分:4)

您可能希望查看XDR中首次定义的rfc1014。显然,您希望找到一个为您的平台实现XDR的库。