一个关于字符串流、十六进制和字符的故事

A story of stringstream, hexadecimal and characters

本文关键字:十六进制 的故事 字符 字符串 一个      更新时间:2023-10-16

我有一个包含十六进制值的字符串(两个字符代表一个字节)。我想使用std::stringstream使转换尽可能轻松,所以我想出了以下代码:

std::string a_hex_number = "e3";
{
    unsigned char x;
    std::stringstream ss;
    ss << std::hex << a_hex_number;
    ss >> x;
    std::cout << x << std::endl;
}

令我最惊讶的是,这打印出"e"…当然我不会轻易放弃,我将代码修改为:

{
    unsigned short y;
    std::stringstream ss;
    ss << std::hex << a_hex_number;
    ss >> y;
    std::cout << y << std::endl;
}

如预期的那样,打印出227

我看了http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/和http://www.cplusplus.com/reference/ios/hex/,但我只是找不到一个参考,告诉我更多关于为什么这种行为来…(是的,我觉得这是正确的,因为当提取一个字符时,它应该采取一个字符,但我有点困惑,std:hexchar字符忽略)。哪里提到过这种情况吗?

(http://ideone.com/YHt7Fz)

编辑如果在任何STL标准中提到此行为,我特别感兴趣。

如果我理解正确,您正在尝试将字符串转换为十六进制为unsigned char。首先,因为这是"input",你应该使用std::istringstream:

std::istringstream ss( a_hex_number );
ss >> std::hex >> variable;

除此之外,您希望输入将字符串解析为积分值。流而不是认为字符类型为数值;他们在里面读了一个字跳过前导空白)。要获得一个数值,您可以应该输入到int,然后转换为unsigned char。字符没有基数,所以std::hex有对他们来说无关紧要。同样的道理也适用于字符串例如,对于浮点数也是如此。)

关于你网站的页面:页面没有提到输入一个字符类型(奇怪的是,因为它有没有谈到其他类型,包括一些非常特殊的类型例)。std::hex操纵器的文档是还有一点很弱:在运行文本中,它只说"已提取"值也应该以十六进制为基础,这不是真的正确;然而,在表格中,它清楚地谈到了"积分值"。在标准中,这被记录在§27.7.2.2.3。(字符类型的>>操作符是而不是)成员函数,但不是自由函数,所以定义在另一个部分。)然而,我们缺少的是一个好的综合了这些东西的文件,无论是>>操作符是成员或者自由函数实际上不是对用户影响大;你想看到所有的>>可用,与他们的语义,在一个地方

简单来说:变量类型比十六进制更"强"。这就是为什么'hex'对于'char'变量会被忽略。

长故事:'Hex'修改stringstream对象的内部状态,告诉它如何处理对整数的后续操作。但是,这不适用于字符

当您打印出一个字符(即unsigned char)时,它被打印为一个字符,而不是一个数字。