使用strstream C++将数字转换为字符串并返回



我有一个程序,要求我通过网络发送号码。我正在尝试将它们转换为字符串,然后使用strstream再次转换回来。我遇到的问题是,当涉及到从流中删除值时,我似乎正在读取不正确的字节数。我怀疑这可能是由于最初的字符串转换,但我并不完全确定。有人知道出了什么问题吗?

我的代码如下

int data1 = 98;
float data2 =  0.5f;
std::strstream stream;
stream << data1 << data2;
string networkData = stream.str();  //assume this line is the string transferred over the network

char numberBuffer[4];
int ReadData1;
float ReadData2;
std::strstream otherStream;
otherStream << networkData;
otherStream.read(&numberBuffer[0], sizeof(int));   //reads 980.f
ReadData1 = atoi(numberBuffer);    //prodces 980
otherStream.read(&numberBuffer[0], sizeof(float));  //reads 5 followed by junk
ReadData2 = atof(numberBuffer);

将两个格式化值写入流后,没有任何东西可以分隔它们,流包含

980.5

由于某种原因,你读回了sizeof(int)字节;如果一个int中有四个字节,那么你得到980.atof转换为980忽略.。然后你读取sizeof(float)字节,给出剩余的5,然后垃圾,因为你已经到达了流的尽头。

一种方法是用空格来分隔值:

stream << data1 << ' ' << data2;

并使用格式化输入将其读回:

otherStream >> ReadData1 >> ReadData2;

从你的代码:

otherStream.read(&numberBuffer[0], sizeof(int));
ReadData1 = atoi(numberBuffer);

在您的平台上,sizeof(int)将是 4 或 8 字节。当然,像这样的数字:

1234567890

是十个字符长,十个字节,这显然不会读取全部。您最终会得到 1234 或 12345678,具体取决于您的平台。

您正在挑选值,就好像它们是二进制编码到流中一样,但它们不是。它们是人类可读的 ASCII 表示形式。当您应用atoiatof时,您似乎理解这一点,但是您已经选择了这些值,就好像它们是二进制格式一样,

并且您使用了sizeof

您的线路协议将需要某种方法来分隔值,并且您将需要解析它们。或者,您的线路协议可以首先对数据进行二进制编码,尽管您需要设置有关数据类型宽度,编码和字节序的约定。

相关内容

  • 没有找到相关文章