Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 主机到网络双重?_C_Double_Sockets_Double Precision_Htonl - Fatal编程技术网

C 主机到网络双重?

C 主机到网络双重?,c,double,sockets,double-precision,htonl,C,Double,Sockets,Double Precision,Htonl,我想通过网络发送一些双精度浮点数。(标准C,标准套接字)没有用于在网络字节顺序之间转换数据的htond或ntohd。我该怎么办?我脑子里有几个解决方案,但我想知道通常的做法是什么 (我还想知道发送64位int的常见做法是什么,比如gstreamer使用的gint64值) 编辑: 这是我想到的一个解决办法。我假定它适用于任何大小的整数,但它适用于双精度整数吗 void swap_if_necessary (void* buff, int buff_len) { uint32_t foo

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

(我还想知道发送64位int的常见做法是什么,比如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;
        }  
    }
}
void swap\u如果需要(void*buff,int buff\u len)
{
uint32_t foo=1;
如果(htonl(foo)!=foo)
{
char*to_swap=(char*)buff;
int i;
对于(i=0;i
您可能希望查看中首先定义了哪些。显然,您希望找到一个为您的平台实现XDR的库。

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

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


简单的整数和字符格式只需进行尾数调整就可以顺利通过,但浮点会变得更复杂。

很好地解释了这种情况。难道你不可以像所有其他整数一样发送64位整数大尾数吗?这和其他整数有什么不同呢?问题是我应该自己把它转换成big-endian,还是有什么库可以帮我转换成big-endian。标准bsd套接字仅具有用于32位和16位整数的函数。GCC提供了
\uuuu builtin\uBSWAP64()
-请参阅这实际上是一种常见做法。浮点格式的变体实在太多了。从IEEE转换或转换到IEEE与使用STROD一样昂贵。如果你想发送大量的数据,需要廉价的转换(声音,实时3D游戏中的位置,…),考虑发送固定点数。我已经使用<代码> SaveTf(……,“%.*e”,DbLyDeMalalStudio -1,x)< /C> >足以唯一地转换<代码>双< /C> >(除了有效载荷的楠之外)。代码>sprintf(…,“%a”,x)也很好。我想我会做我自己的字节交换,我在问题编辑中添加的那个,但是在64位整数而不是双精度整数上。老实说,64位整数对我来说已经足够了。我想发送一些从gstreamer检索到的与时间相关的信息。它将时间间隔存储为64位整数中的毫秒数。我只是为了自己的“满足感”将它们转换为双精度,因为我已经习惯了NSTimeinterval,一个存储为秒数(双浮点)的时间间隔,在Apple(iOS和OSX)C和ObjectiveC框架中使用。