一个关于字符串流、十六进制和字符的故事
A story of stringstream, hexadecimal and characters
我有一个包含十六进制值的字符串(两个字符代表一个字节)。我想使用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:hex
被char
字符忽略)。哪里提到过这种情况吗?
(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
)时,它被打印为一个字符,而不是一个数字。
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- C++将 wwn 字符串转换为识别为十六进制的数据类型
- C++十六进制字符串转换为十六进制的字符 *
- char* 如何读取十六进制的这个整数?它在 ostream::write() 中是如何工作的
- 我如何在GDB中打印十六进制的双重位
- 什么是十六进制的 CRLF
- 将十六进制的数字与零串联
- 十六进制的编码类型
- 十六进制的六角字节
- 初始化变量到十六进制的优势
- 如何在不显示十六进制的情况下读取dat文件中的文本?C++
- 从文本文件到实际十六进制的文本十六进制数据字符串
- 处理从十六进制到十六进制的转换
- 将字符串转换为十六进制的最简单方法是什么?C++
- c++修剪并填充十六进制的无符号int,用于#RGB值
- 十六进制的字符串流>> uint8_t?C++
- 从浮点到十六进制的转换在写入内存时不正确
- 将十六进制的键值转换为十进制
- 将IDC_Edit文本转换为十六进制的WORD
- visual将浮点数转换为32位十六进制的c++