使用stringstream获取字节值

时间:2010-07-28 19:27:04

标签: c++ iostream stringstream

我有这个(不正确的)示例代码,用于从字符串流中获取值并将其存储在字节大小的变量中(它需要在单个字节var中,而不是int):

#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char** argv)
{
    stringstream ss( "1" );

    unsigned char c;
    ss >> c;

    cout << (int) c << endl;
}

我运行时的输出是49,这不是我想看到的。显然,这被视为char而不是简单的数值。什么是c ++在获取int时获得1而不是49的方法?

谢谢!

5 个答案:

答案 0 :(得分:10)

大多数C ++ - ish方式肯定是通过读入另一个整数类型来解析值,并且然后强制转换为字节类型(因为读入{ {1}}永远不会解析 - 它总是只读取下一个字符):

char

我使用typedef unsigned char byte_t; unsigned int value; ss >> value; if (value > numeric_limits<byte_t>::max()) { // Error … } byte_t b = static_cast<byte_t>(value); ,因为那是最自然的,虽然unsigned int当然也可以。

答案 1 :(得分:3)

char会一直这样做。你需要读取一个int(或浮点数或双精度等),否则将调用错误的'formatter'。

unsigned char c;
unsigned int i;
ss >> i;
c = i;

答案 2 :(得分:2)

从中减去'0'

cout << (int) (c - '0') << endl;

'0'的值为48,因此49 - 48 = 1

答案 3 :(得分:0)

stringstream ss( "1" );
unsigned char c;
{
    unsigned int i;
    ss >> i;
    c = i;
}
cout << static_cast<int>(c) << endl;

会工作吗?你也可以做一些不安全的指针,但我会选择上面的内容。

答案 4 :(得分:-1)

这是因为C ++中的字符串常量被视为文本 两个选项:

  • 使用转义号码对字符串进行编码:

    • 八进制数:\ 0&lt; d&gt; {1,3}
    • 十六进制数字:\ 0x&lt; d&gt; {2}

    std :: stringstream(“\ 01 \ 02 \ 03 \ 04 \ 0xFF”);

  • 或者构建一个char数组并使用数字初始化它:

    char data [] = {0,1,2,3,4,255};

怎么样:

#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char** argv)
{
    char x[] = {1,0};
    stringstream ss( x);

    unsigned char c;
    ss >> c;

    cout << (int) c << endl;
}