在windows和linux之间通过c ++套接字发送float数组

时间:2011-09-28 12:21:25

标签: c++ arrays sockets networking floating-point

我希望从Windows客户端和Linux服务器之间发送浮点数组数据(双向)。论坛中的大多数查询都解决了一些稍微高级的问题,比如c ++到java等。我的数组可能大到1024x1024。哪个是解决这个问题的最佳方法?如果可能,请通过伪代码和真实代码示例显示。我更喜欢使用本机winsock库。 谢谢


谢谢大家, 我认为将浮点数作为字符数组发送可能是最简单的。我不担心带宽,因为我不会经常发送数据,但其他建议似乎要求快速修复。

4 个答案:

答案 0 :(得分:2)

您可以使用protobuf库。

答案 1 :(得分:1)

如果你想要真正可移植,那么将浮动作为字符串发送可能是最好的方法。

那就是说,如果您可以假设所有计算机都将使用IEEE754浮点标准(这是目前PC / Mac / Linux编程的有效假设),那么您可以逐字发送原始数据(即通过memcpy()将每个浮点数作为4个字节发送。

唯一的问题是如果你想处理使用不同字节序的机器...例如从英特尔发送到PowerPC机器。在这种情况下,其中一台机器需要在发送它们之前(以及它接收它们之后)反转4个字节的顺序,这样它仍然可以解释它们与它的对应物相同。 (没有ntohf()或htonf()函数,但是您可以通过memcpy()将其手动字节交换为int32_t,然后对int32_t进行字节交换并在接收时发送...您将recv( )将数据转换为int32_t,将int32_t字节交换,然后将memcpy()结果转换为float。注意这里的转换和赋值是不够的,必须使用memcpy()将数据从int32_t复制到float反之亦然 - 否则某些CPU类型(例如英特尔)上的浮点和整数寄存器之间缺乏互操作性会咬你并给你错误的结果。

答案 2 :(得分:0)

在两个不同的盒子之间发送花车不是一个好主意。标准不保证浮点数的内部表示,因此浮动的位副本可能会导致两台机器上的值不同。

您可以将浮点数转换为字符串然后再转回,但这不是特别有效(对于处理器或带宽)。

答案 3 :(得分:0)

正如lollo所说,你可以使用Google Proto Buffers。但是如果你只是想发送这些花车,你不需要整个复杂的东西。

您可以将float序列化为字节,发送它们并在另一端读取它们。确保两个编译器/操作系统都使用IEEE float format(主流编译器/操作系统都是如此)。

同时检查this question