2013-01-20 177 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,因此我可以在保持代碼幾乎完好的情況下進行演示。

相關問題