Here follows a basic C++ hex dumper function. It is public
domain so do whatever you want with it.
#include <ostream>
#include <string>
namespace neolib
{
template<class Elem, class Traits>
inline void hex_dump(const void* aData, std::size_t aLength, std::basic_ostream<Elem, Traits>& aStream, std::size_t aWidth = 16)
{
const char* const start = static_cast<const char*>(aData);
const char* const end = start + aLength;
const char* line = start;
while (line != end)
{
aStream.width(4);
aStream.fill('0');
aStream << std::hex << line - start << " : ";
std::size_t lineLength = std::min(aWidth, static_cast<std::size_t>(end - line));
for (std::size_t pass = 1; pass <= 2; ++pass)
{
for (const char* next = line; next != end && next != line + aWidth; ++next)
{
char ch = *next;
switch(pass)
{
case 1:
aStream << (ch < 32 ? '.' : ch);
break;
case 2:
if (next != line)
aStream << " ";
aStream.width(2);
aStream.fill('0');
aStream << std::hex << std::uppercase << static_cast<int>(static_cast<unsigned char>(ch));
break;
}
}
if (pass == 1 && lineLength != aWidth)
aStream << std::string(aWidth - lineLength, ' ');
aStream << " ";
}
aStream << std::endl;
line = line + lineLength;
}
}
}
Example usage:
#include <iostream>
#include <string>
#include <neolib/hexdump.hpp>
int main()
{
std::string r;
for (int i = 0; i != 100; ++i)
{
r += rand() % 256;
}
neolib::hex_dump(r.c_str(), r.size(), std::cout);
}
Example output:
0000 : )#...l..R.I..... 29 23 BE 84 E1 6C D6 AE 52 90 49 F1 F1 BB E9 EB 0010 : ...<..>.$^....G. B3 A6 DB 3C 87 0C 3E 99 24 5E 0D 1C 06 B7 47 DE 0020 : ..M.C.....Z}.8%. B3 12 4D C8 43 BB 8B A6 1F 03 5A 7D 09 38 25 1F 0030 : ].....E;.......2 5D D4 CB FC 96 F5 45 3B 13 0D 89 0A 1C DB AE 32 0040 : .P.@x6..I2..}I. 20 9A 50 EE 40 78 36 FD 12 49 32 F6 9E 7D 49 DC 0050 : .O..D@f.k.0.2;." AD 4F 14 F2 44 40 66 D0 6B C4 30 B7 32 3B A1 22 0060 : .".. F6 22 91 9D