2013-01-20 152 views
2

使用字符串流很容易对一个字符串进行十六进制编码,但是是否可以执行反向操作并使用字符串流解码结果字符串?使用字符串流解码一个十六进制编码的字符串

#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系列函数。

回答

5

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

+0

我相信你还需要在每对中加上0x。 –

+0

@MaciejStachowski不,前缀对于'std :: stoi'是可选的。 –

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,因此我可以在保持代码几乎完好的情况下进行演示。

相关问题