【问题标题】:Converting numbers to string and back using strstream C++使用 strstream C++ 将数字转换为字符串并返回
【发布时间】:2015-07-04 21:08:10
【问题描述】:

我有一个程序要求我通过网络发送号码。我正在尝试将它们转换为字符串,然后使用 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);

【问题讨论】:

  • 您应该以二进制字节而不是字符串的形式发送数据。如果您继续使用字符串,那么您可能需要为它们添加长度前缀,以便知道要读取多少个字符。
  • 或者在数字之间放一个空格...
  • 您是否也在使用特定库通过网络发送数据?你可以使用任何图书馆吗? Google 协议缓冲区可以帮助抽象出这些细节。
  • 此外,字符串表示(通常)更大,并且在最终转换为二进制值时不会保持精度(即浮点)。
  • @JamesAdkison 他可能需要在小端和大端之间发送,作为文本发送是一种可能的解决方案。

标签: c++ string c++11 casting stream


【解决方案1】:

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

980.5

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

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

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

并使用格式化输入读回它们:

otherStream >> ReadData1 >> ReadData2;

【讨论】:

    【解决方案2】:

    来自您的代码:

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

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

    1234567890
    

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

    【讨论】:

    • 这取决于您正在阅读的文件的格式。如果数字后跟一个空格,std::istream 应该自己处理它。如果数字后跟其他字符,则必须逐个字符读取 std::istream,直到将整个数字作为文本读取,然后使用 atoi() 或其他方法将其转换为数值否则。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多