![](/img/trans.png)
[英]C# or C/C++ How to receive packets from client, filter & redirect them to server, receive from server & send to client
[英]Send float array from C++ server to C# client
我正在尝试将一些数据从C ++服务器发送到C#客户端。 我能够发送char数组。 但是浮点数组存在一些问题。
这是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
这里有2个问题在c#侧 - 1)首先它不处理0x80以上的任何东西(127以上)(不兼容的结构?)2)由于一些令人难以置信的原因它丢了一个字节!!
这在接收数据时正好在'temp'中发生
我一直试图找出一些东西,但没有任何东西。 你知道为什么会这样吗? 我确定我做错了什么...建议采取更好的方法?
非常感谢
从你的代码中不清楚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不会这样做,因为它旨在让您准确指定要从流中读取的数据类型。
在网络中,您应始终将您的数字转换为通用格式,然后回读。 换句话说,应该封装除字节之外的任何数据。 因此,无论您的编程语言如何,这都是您需要做的。 我无法评论您的代码有什么问题,但这可能会解决您的问题,并会在以后节省一些麻烦。 想想架构是64位还是使用不同的endian。
编辑:
我想你的问题在于签名无签名,可以用Isak的答案来解决,但仍然记得我所说的。
如果您需要有关封装的帮助,请查看Beej的网络指南。 它应该有一个如何通过网络编码浮点数的示例。
我不确定C#,但是C ++不保证浮点数(或任何其他数据类型)的内部二进制表示。 据你所知,0.42可能用这4个字节表示:'0','。','4','2'。
最简单的解决方案是传输人类可读的字符串,如“2.1 9.9 12.1 94.9 2.1”和使用cin / cout / printf / scanf和朋友。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.