Hex dump (16進数表示) のプログラム (Boost.Format 使用)

16進数ダンプの関数を書いてみた.(Debugger使うのはおいといて・・・.)

せっかくなので,Boost.Formatを使ってみる.

/** @file hex_dump.hpp
 *  @brief Header file for fanction to display variable in hex.
 */
#ifndef HEX_DUMP_HPP__INCLUDED
#define HEX_DUMP_HPP__INCLUDED

#include <iostream>
#include <iomanip>

#include <boost/cstdint.hpp>
#include <boost/format.hpp>

template <class T> 
void dumpHex(const T& t) 
{
  for (size_t i = 0; i < sizeof(T); ++i) {
    std::cout << boost::format("%02X")
                 % (static_cast<unsigned short>(*(reinterpret_cast<boost::uint8_t*>(const_cast<T*>(&t)) + i)))
              << ' ';
  }
  std::cout << '\n';
}

// just for your reference
template <class T> 
void dumpHex_noBoost(const T& t) 
{
  for (size_t i = 0; i < sizeof(T); ++i) {
    std::cout << std::setw(2) << std::setfill('0') << std::hex << std::uppercase
              << (static_cast<unsigned short>(*(reinterpret_cast<unsigned char*>(const_cast<T*>(&t)) + i)))
              << ' ';
  }
  std::cout << '\n';
}

#endif //< HEX_DUMP_HPP__INCLUDED

テスト:

#include <iostream>

#include "hex_dump.hpp"

int main()
{
  short shortData = 12345;
  int intData = 1234567890;
  long long longlongData = 12345678901234567890;
  float floatData = 1234.5678f;
  double doubleData = 9.9e9;

  std::cout << "size of variable \n";
  std::cout << "short: " << sizeof(shortData) << '\n';
  std::cout << "int: " <<  sizeof(intData) << '\n';
  std::cout << "long long: " <<  sizeof(longlongData) << '\n';
  std::cout << "float: " <<  sizeof(floatData) << '\n';
  std::cout << "double: " <<  sizeof(doubleData) << '\n';
  std::cout << "\n";

  std::cout << "Hex dump \n";
  dumpHex(shortData);
  dumpHex(intData);
  dumpHex(longlongData);
  dumpHex(floatData);
  dumpHex(doubleData);
  std::cout << "\n";

  std::cout << "Hex dump (no Boost ver.) \n";
  dumpHex_noBoost(shortData);
  dumpHex_noBoost(intData);
  dumpHex_noBoost(longlongData);
  dumpHex_noBoost(floatData);
  dumpHex_noBoost(doubleData);
  std::cout << "\n";

  return 0;
}

実行結果は次のようになる:

  size of variable
  short: 2
  int: 4
  long long: 8
  float: 4
  double: 8
  
  Hex dump
  39 30
  D2 02 96 49
  D2 0A 1F EB 8C A9 54 AB
  2B 52 9A 44
  00 00 00 18 B0 70 02 42

簡単な解説

上のコードではキャストが乱舞しているが,本質的には

(short)(*((unsigned char*)&t))

である.

&t // 対象データのアドレス
(unsigned char*)&t // 対象データへのポインタ.1 byteデータとして解釈.
 *((unsigned char*)&t) // 中身
(short)(*((unsigned char*)&t)) // 中身を数値データとして解釈→表示へ

参考にしたサイト