代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

使用stringstream获取字节值

  •  6
  • twk Mark Adler  · 技术社区  · 14 年前

    我有一个(不正确的)示例代码,用于从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,这不是我想要看到的。显然,这被视为一个字符,而不是简单的数值。当转换为int时,用什么样的c++方式使c保持1而不是49?

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  10
  •   Konrad Rudolph    14 年前

    解析 通过读入另一个整数类型来正确读取值,以及 然后 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 unsigned short 当然也行。

        2
  •  3
  •   Gianni    14 年前

    一个char总是这样做的。您需要读取int(或float或double等),否则将调用错误的“格式化程序”。

    unsigned char c;
    unsigned int i;
    ss >> i;
    c = i;
    
        3
  •  2
  •   Donald Miner    14 年前

    减法 '0'

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

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

        4
  •  0
  •   sbi    14 年前
    stringstream ss( "1" );
    unsigned char c;
    {
        unsigned int i;
        ss >> i;
        c = i;
    }
    cout << static_cast<int>(c) << endl;
    

    会有用的。你也可以做一些不安全的指针的东西,但我只会去上面。

        5
  •  -1
  •   Loki Astari    14 年前


    两种选择:

      • 八进制数:\0<d>{1,3}
      • 十六进制数:\0x<d>{2}

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

    • 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;
    }