Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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#客户端 我试图从C++服务器发送一些数据到C客户端。我能够发送超过个字符数组。但是浮点数组存在一些问题_C#_C++_Sockets - Fatal编程技术网

从C+发送浮点数组+;服务器到C#客户端 我试图从C++服务器发送一些数据到C客户端。我能够发送超过个字符数组。但是浮点数组存在一些问题

从C+发送浮点数组+;服务器到C#客户端 我试图从C++服务器发送一些数据到C客户端。我能够发送超过个字符数组。但是浮点数组存在一些问题,c#,c++,sockets,C#,C++,Sockets,这是C++服务器端代码 float* arr; arr = new float[12]; //array init... if((bytecount = send(*csock, (const char*)arr, 12*sizeof(float), 0))==SOCKET_ERROR){ } 是的,我正试图发送一个大小为12的浮点数组 这是客户端的代码。(奇怪的是,最初没有简单的方法将浮子从溪流中取出。我以前从未使用过C,也许还有更好的方法?) 在c方面有两个问题- 1) 首先,它不处理0x

这是C++服务器端代码

float* arr;
arr = new float[12];
//array init...
if((bytecount = send(*csock, (const char*)arr, 12*sizeof(float), 0))==SOCKET_ERROR){
}
是的,我正试图发送一个大小为12的浮点数组

这是客户端的代码。(奇怪的是,最初没有简单的方法将浮子从溪流中取出。我以前从未使用过C,也许还有更好的方法?)

在c方面有两个问题- 1) 首先,它不处理0x80以上(127以上)的任何内容(不兼容的结构?) 2) 出于某种难以置信的原因,它会掉一个字节

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

我一直在想办法,但还是一无所获。 你知道为什么会这样吗?我肯定我做错了什么。。。 关于更好方法的建议


非常感谢

从您的代码中不清楚streamReader变量指向什么(即它的类型?),但我建议您使用。这样,您就可以只读取数据,而不必费心处理
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

编辑:
我猜你的问题在于签名-未签名,可以用伊萨克的答案来解决,但请记住我说过的话

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

< P>我不确定C是什么,但C++不能保证浮动(或任何其他数据类型)的内部、二进制表示。众所周知,0.42可能使用以下4个字节来表示:“0”、“4”、“2”


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

StreamReader
定义为
System.IO.StreamReader()
。是的,我认为BinaryReader可能是一个更好的选择。谢谢,让我试试。是的,我知道。只是如果你看到内存转储,一些浮点数就可以正常传输了!
printf
是否保证输出的形式?我在理论上同意,但在实践中,与IEEE 754(定义了双精度和浮点)相比,是否真的有任何不同的浮点表示法(顺便说一句,c#确实规定了浮点和双精度的格式,如上述标准所定义)否,但是一个实现可以自由使用,比如说,对
float
s使用双精度。我身上没有这个标准,所以我无法检查,但问题是编写可移植程序时必须这样做。字节顺序是另一个需要警惕的问题。谢谢你的C#位。@svick:是的,不过必须注意当前的语言环境。
//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
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.