読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Boost.Algorithm を使ってみた (hex, unhex)

C++ Boost

Boost.Algorithmが採択されました - Faith and Brave - C++で遊ぼう
Boost.Algorithmが採択されたそうです。早速一部使ってみました。
どうやらC++11で追加されたアルゴリズムのフォローがメインのようですが,見慣れないアルゴリズム(?)の hex と unhex を見つけたので使ってみました。ドキュメントによると MySQL の HEX, UNHEX がベースになっているそうですが,なんか微妙に違う感じです。

コード

#include<iostream>
#include<vector>
#include<iterator>
#include<initializer_list>
#include<cstdint>
#include<boost/algorithm/hex.hpp>

template<class Range>
void p(Range const & r)
{
 for(auto const & i: r)
  std::cout << i;
 std::cout << std::endl;
}

int main()
{
 // hex
 std::cout << "hex sample\n";

 // Iterator ver.
 {
  std::vector<long> const in{1, 2, 4, 8, 16, 32, 64, 128};
  std::vector<char> out;
  boost::algorithm::hex(in.begin(), in.end(), std::back_inserter(out));
  p(out);
 }
 // 0-terminated ver.
 {
  int const in[]{1, 2, 3, 4, 10, 14, 15, 16, 0};
  char out[64];
  boost::algorithm::hex(in, out);
  p(out);
 }
 // Range ver.
 {
  std::string out;
  boost::algorithm::hex(std::initializer_list<long long>{0xFLL, 0xFFLL, 0xFFFLL, 0xFFFFLL},
                        std::back_inserter(out));
  p(out);
 }

 // unhex
 std::cout << "unhex sample\n";

 // Iterator ver.
 {
  std::string const in{"00000000FFFFFFFF"};
  std::vector<int32_t> out;
  boost::algorithm::unhex(in.begin(), in.end(), std::back_inserter(out));
  p(out);
 }
 // 0-terminated ver.
 {
  char const in[] = "00C0FFEE";
  int32_t out[1];
  boost::algorithm::unhex(in, out);
  p(out);
 }
 // Range ver.
 {
  std::vector<uint32_t> out;
  out.resize(1);
  boost::algorithm::unhex(std::initializer_list<char>{'D', 'e', 'a', 'd', 'B', 'e', 'e','f'}, out.begin());
  p(out);
 }
}

実行結果

hex sample
0000000100000002000000040000000800000010000000200000004000000080
000000010000000200000003000000040000000A0000000E0000000F00000010
000000000000000F00000000000000FF0000000000000FFF000000000000FFFF
unhex sample
0-1
12648430
3735928559

テンプレートなので型はいくらか変えられますが,基本的に,16進数8文字と32ビットの値の相互変換みたいな感じです。