2011-07-23 114 views
7

我想从C++服务器发送一些数据到C#客户端。我能够发送字符数组。但浮点数组存在一些问题。发送float数组从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

的float数组这里是为客户端的代码。 (奇怪的是,有没有简单的方法来获得浮出摆在首位流的。我从来没有使用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)?一些令人难以置信的原因,它降低了一个字节!

,这发生在“临时”就在接收到数据

我一直在试图找出仍然出来的东西,但没有时间。 你知道为什么会发生这种情况吗?我敢肯定我做错了什么... 建议更好的方法?

非常感谢

回答

5

目前尚不清楚,从你的代码是什么streamReader变量指向(即什么是它的类型?),但我会建议你使用BinaryReader代替。这样的话,你可以只读取数据one float at a time并与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不会这样做,因为它旨在让您准确指定要从流中读出的数据类型。

+0

'StreamReader'被定义为'System.IO.StreamReader()'。是的,我认为'BinaryReader'可能是一个更好的选择。谢谢,让我试试看。 – sg88

+0

谢谢!!尝试和测试它 - 它的作品 – sg88

1

在网络中,您应该始终将您的号码转换为通用格式,然后回读。换句话说,除字节以外的任何数据都应该被封装。所以不管你的编程语言如何,这都是你需要做的。我无法评论你的代码出了什么问题,但这可能会解决你的问题,并且稍后会节省一些头痛的问题。想想架构是64位还是使用不同的endian。

编辑:
我猜你的问题在于签署无符号,可与伊萨克的答案来解决,但仍介意我说的话。

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

+0

是我知道的。只是如果你看到内存转储,一些浮点数就会转移得很好! – sg88

1

我不确定C#,但C++不保证浮点数(或任何其他数据类型)的内部二进制表示形式。对于你所知道的,0.42可能用这4个字节表示:'0','。','4','2'。

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

+0

'printf'是否可以保证输出的形式? – svick

+0

我理论上同意,但在实践中,实际上是否存在与IEEE 754(定义double和float两者)一样的使用中的任何不同的浮点表示? –

+0

(和顺便说一句,c#确实指定了float和double的格式,如上面提到的标准中所定义的那样)http://msdn.microsoft.com/en-us/library/aa691146(v=vs.71).aspx –

相关问题