3

stringstream を使用して文字列を 16 進エンコードするのは簡単ですが、逆を行って結果の文字列を 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;
}

バイトを直接ビットシフトしたり、関数のscanfファミリーなどの古いc関数を使用したりするつもりはありません。

4

2 に答える 2

5

区切り記号のない 16 進数のストリームがある場合は、それほど簡単ではありません。std::basic_istream::getorを使用std::basic_istream::readして一度に 2 桁を抽出し、次に egstd::stoiを使用して整数に変換し、それを a に型キャストすることができます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;
}

最初のパイプを2番目のパイプに接続してこれらを実行するとhello, world、出力として取得されます。

明らかに、stringstream作品からのデータの読み取りは、からの読み取りとほぼ同じstd::cinです。コードをほとんどそのままにして、デモンストレーションできるようにcinを使用しました。

于 2013-01-20T05:05:43.017 に答える