c++ - 从文件中取出两个十六进制字符并存储为具有相关十六进制值的字符

标签 c++ stream hex

我想从流中取出接下来的两个十六进制字符,并将它们作为关联的十六进制->十进制数值存储在一个字符中。

因此,如果输入文件包含 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/writeoperator<</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/

相关文章:

python - 如何使用 python 查看目录中每个文件的第一行

c++ - 如何将 C++ time_t 对象设置为纪元?

.net - 如何阻止 XPathDocument 关闭流?

c# - 在异步任务仍在使用时处置流

c - 十六进制值作为字符串 C

c++ - 用 0x 作为十六进制值的前缀

c# - 在 for 中插入 while 循环。将此视为一个脑筋急转弯

c++ - 为什么 MSVC 选择 long long 作为 -2147483648 的类型?

c++ - 如何添加 2 个四位十六进制来生成 ASCII 字符字节

c++ - 指针数组困惑