我想从流中取出接下来的两个十六进制字符,并将它们作为关联的十六进制->十进制数值存储在一个字符中。
因此,如果输入文件包含 2a3123
,我想获取 2a
,并将数值(十进制 42)存储在字符中。
我试过了
char c;
instream >> std::setw(2) >> std::hex >> c;
但这给了我垃圾(如果我用 int
替换 c
,我得到 signed int
的最大值)。
任何帮助将不胜感激!谢谢!
编辑:我应该注意,字符保证在字符的正确范围内,并且文件是有效的十六进制。
最佳答案
好吧,我认为处理 ASCII 解码根本不是一个好主意,并不能真正回答问题。
我认为您的代码不起作用,因为 setw()
或 istream::width()
仅当您阅读 std::string
时有效或 char*
.我猜是从here
您如何使用标准 C++ iostream 转换器的优点。我想出了使用 stringstream
的想法类和 string
作为缓冲区。事情是阅读n
将字符放入缓冲区,然后使用 stringstream
作为转换器设施。
我不确定这是否是最佳版本。可能不是。
代码:
#include <iostream>
#include <sstream>
int main(void){
int c;
std::string buff;
std::stringstream ss_buff;
std::cin.width(2);
std::cin >> buff;
ss_buff << buff;
ss_buff >> std::hex >> c;
std::cout << "read val: " << c << '\n';
}
结果:
luk32@genaker:~/projects/tmp$ ./a.out
0a10
read val: 10
luk32@genaker:~/projects/tmp$ ./a.out
10a2
read val: 16
luk32@genaker:~/projects/tmp$ ./a.out
bv00
read val: 11
luk32@genaker:~/projects/tmp$ ./a.out
bc01
read val: 188
luk32@genaker:~/projects/tmp$ ./a.out
01bc
read val: 1
正如您所见,它的抗错性不是很好。尽管如此,适用于给定条件,可以扩展为循环,最重要的是使用 iostream
转换设施,因此您身边没有 ASCII 魔法。不过,C/ASCII 可能会更快。
附言。改良版。使用简单 char[2]
缓冲区并使用非格式化的写入/读取在缓冲区中移动数据(get
/write
与 operator<<
/operator>>
相对)。理由很简单。我们不需要任何幻想来移动 2 个字节的数据。然而,我们使用格式化的提取器来进行转换。为了方便起见,我把它做了一个循环版本。虽然这不是 super 简单。我花了整整 40 分钟才搞清楚非常重要的台词。如果没有它们,提取将适用于前 2 个字符。
#include <iostream>
#include <sstream>
int main(void){
int c;
char* buff = new char[3];
std::stringstream ss_buff;
std::cout << "read vals: ";
std::string tmp;
while( std::cin.get(buff, 3).gcount() == 2 ){
std::cout << '(' << buff << ") ";
ss_buff.seekp(0); //VERY important lines
ss_buff.seekg(0); //VERY important lines
ss_buff.write(buff, 2);
if( ss_buff.fail() ){ std::cout << "error\n"; break;}
std::cout << ss_buff.str() << ' ';
ss_buff >> std::hex >> c;
std::cout << c << '\n';
}
std::cout << '\n';
delete [] buff;
}
示例输出:
luk32@genaker:~/projects/tmp$ ./a.out
read vals: 0aabffc
(0a) 0a 10
(ab) ab 171
(ff) ff 255
请注意,c
没有按预期阅读。
我在这里找到了所有需要的东西 http://www.cplusplus.com/reference/iostream/
关于c++ - 从文件中取出两个十六进制字符并存储为具有相关十六进制值的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12505077/