使用字符串流对字符串进行十六进制编码很容易,但是可以反过来使用字符串流解码生成的字符串吗?
#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系列函数。
答案 0 :(得分:5)
如果你只有一个没有分隔符的十六进制数字流,那就不那么容易了。您可以使用std::basic_istream::get
或std::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,因此我可以在保持代码几乎完整的情况下进行演示。