On 8/2/17 3:39 PM, Andre Pany wrote:
This application opens the file passed as argument and display the content in hex and text format:

00 00 03 00 00 00 64 00 00 00 FF 56 01 00 00 70 ......d... V..p
02 00 FF A6 00 00 00 20 02 00 00 00 00 00 00 00    . ยช... .......
00 00 00 00 00 00 00 00 00 00 00 00                ............

void main(string[] args)
{
import std.file, std.string, std.range, std.array, std.algorithm, std.digest, std.conv;
     import std.stdio: writeln;

     enum cols = 16;
     auto data = cast(const(ubyte)[]) read(args[1]);

     foreach(g; data.chunks(cols))
     {
         string hex = g.toHexString.chunks(2).join(" ").to!string;
         string txt = g.map!(b => b == 0 ? '.' : char(b)).array;
         writeln(hex.leftJustify(cols * 2 + (cols - 1), ' '), "    ", txt);
     }
}

Very nice!

I think actually you are going to have a bit of trouble with the 'text' output, since D is going to output the character array as unicode, vs. a normal hexdump which will output as one glyph per byte. You could do this poorly by changing the map condition to b == 0 || b >= 0x80.

Actually you may want to substitute some extra chars, as I'm not sure low bytes are printable (or will print what you really want them to).

-Steve

Reply via email to