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)) // 中身を数値データとして解釈→表示へ
参考にしたサイト
- とりあえず C++ - ファイルデータを16進数で表示する
- http://www.geocities.jp/eneces_jupiter_jp/cpp1/020-020.html
- iostreamの書式指定を参考にした
- http://www.geocities.jp/eneces_jupiter_jp/cpp1/020-020.html
- How do I display the binary representation of a float or double? - Stack Overflow
- http://stackoverflow.com/questions/397692/how-do-i-display-the-binary-representation-of-a-float-or-double
- std::bitsetを使って2進数表示するサンプルの投稿あり
- http://stackoverflow.com/questions/397692/how-do-i-display-the-binary-representation-of-a-float-or-double
- How can i convert hex numbers to binary in c++? - Stack Overflow
- http://stackoverflow.com/questions/483609/how-can-i-convert-hex-numbers-to-binary-in-c
- char型を数値型表示するminimumなサンプルの投稿あり
- http://stackoverflow.com/questions/483609/how-can-i-convert-hex-numbers-to-binary-in-c