将浮点数组从c++服务器发送到c#客户端

本文关键字:客户端 服务器 c++ 数组 | 更新日期: 2023-09-27 18:03:32

我正试图从c++服务器发送一些数据到c#客户端。我可以发送字符数组。但有一些问题与浮动数组。

这是c++服务器端的代码

float* arr;
arr = new float[12];
//array init...
if((bytecount = send(*csock, (const char*)arr, 12*sizeof(float), 0))==SOCKET_ERROR){
}

所以是的,我试图发送一个大小为12的浮点数组。

是客户端的代码。(奇怪的是,一开始就没有容易的办法把漂浮物从河里弄出来。我以前从未使用过c#,也许有更好的东西?)

//get the data in a char array 
streamReader.Read(temp, 0, temp.Length);  
//**the problem lies right here in receiving the data itself
//now convert the char array to byte array
for (int i = 0; i < (elems*4); i++)           //elems = size of the float array
{
    byteArray = BitConverter.GetBytes(temp[i]);
    byteMain[i] = byteArray[0];
}
//finally convert it to a float array
for (int i = 0; i < elems; i++)
{
    float val = BitConverter.ToSingle(byteMain, i * 4);
    myarray[i] = val;
}

让我们看看两边的内存转储,问题就清楚了-

//c++ bytes corresponding to the first 5 floats in the array
//(2.1 9.9 12.1 94.9 2.1 ...)
66 66 06 40    66 66 1e 41     9a 99 41 41    cd cc bd 42    66 66 06 40
//c# - this is what i get in the byteMain array
66 66 06 40    66 66 1e 41     fd fd 41 41    fd 3d  ? 42    66 66 06 40

在c#方面有两个问题1)首先它不处理任何高于0x80(高于127)(不兼容的结构?)2)由于一些难以置信的原因,它会掉一个字节!!

,这发生在'temp'中,就在接收数据的时候

我一直想弄清楚一些事情,但仍然一无所获。你知道为什么会这样吗?我肯定我做错了什么……对更好的方法有什么建议?

Thanks to lot

将浮点数组从c++服务器发送到c#客户端

从你的代码中不清楚streamReader变量指向什么(即它的类型是什么?),但我建议你使用BinaryReader代替。这样,你就可以一次只读取一个浮点数,而不必为byte[]数组操心:

var reader = new BinaryReader(/* put source stream here */)
var myFloat = reader.ReadSingle();
// do stuff with myFloat...
// then you can read another
myFloat = reader.ReadSingle();
// etc.

不同的阅读器对数据做不同的事情。例如,文本阅读器(和流阅读器)将假设所有文本都是特定编码(如UTF-8)的文本,并可能以您意想不到的方式解释数据。BinaryReader不会这样做,因为它的设计目的是让您精确指定要从流中读取的数据类型。

我对c#不太确定,但c++对浮点数(或任何其他数据类型)的内部二进制表示没有保证。众所周知,0.42可以用这4个字节来表示:'0','。', '4', '2'.

最简单的解决方案是传输人类可读的字符串,如"2.1 9.9 12.1 94.9 2.1",并使用cin/cout/printf/scanf等。

在网络中,你应该总是把你的数字转换成通用格式,然后再读回来。换句话说,除了字节之外的任何数据都应该被封装。所以不管你的编程语言是什么,这就是你需要做的。我不能评论你的代码有什么问题,但这可能会解决你的问题,并将节省一些头痛以后。想想如果架构是64位或者它使用不同的端序。

编辑:
我猜你的问题是有署名的,没有署名的,可以用Isak的回答来解决,但是我还是记得我说过的话。

如果你需要帮助的封装检查Beej的网络指南。它应该有一个如何在网络上编码浮点数的示例。