3

使用 stringstream 对字符串进行十六进制编码很容易,但是是否可以反过来使用 stringstream 解码生成的字符串?

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

int main()
{
  std::string test = "hello, world";

  std::stringstream ss; 
  ss << std::hex << std::setfill('0');
  for (unsigned ch : test)
    ss << std::setw(2) << int(ch);

  std::cout << ss.str() << std::endl;
}

我不希望直接对字节进行位移或使用旧的 c 函数,例如 scanf 系列函数。

4

2 回答 2

5

如果您只有一个没有分隔符的十六进制数字流,那么就不是那么容易了。您可以使用std::basic_istream::getorstd::basic_istream::read一次提取两个数字,然后使用 egstd::stoi转换为整数,然后可以将其类型转换为char.

于 2013-01-20T05:01:03.847 回答
1

如果在数字之间放置某种分隔符。举例来说,让我们首先更改代码以在输出的每个字节之间插入一个空格:

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

int main()
{
  std::string test = "hello, world";

  std::stringstream ss; 
  ss << std::hex << std::setfill('0');
  for (unsigned ch : test)
    ss << std::setw(2) << int(ch) << " ";

  std::cout << ss.str() << std::endl;
}

然后,让我们编写一个小程序从 cin 中读取该数据,并再次将其打印为字符:

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

int main()
{
    int i;
    while (std::cin >> std::hex >> i)
        std::cout << static_cast<char>(i);
    return 0;
}

当我用第一个管道到第二个运行这些时,我得到hello, world了输出。

显然,从 a 中读取数据与stringstream从 - 我使用 cin 读取数据几乎相同,std::cin因此我可以在保持代码几乎完整的同时进行演示。

于 2013-01-20T05:05:43.017 回答