使用字符串流解码十六进制编码的字符串

时间:2013-01-20 04:54:33

标签: c++ encoding hex 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系列函数。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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作为输出。

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