Update: You might want to read this new version of the code instead. Thanks ispak
I was playing with a hex editor recently and then I thought it would be pretty easy to make a program to output what you see on a text editor. Here’s a quick & dirty Hex Visor I wrote in like 5 minutes with Java. It shows 15 bytes per line, and on the right side it prints all the visible characters of the ascii table, the non-visible ones are replaced with “.”
Enjoy:
[java]
//HexViewer.java
import java.io.*;
public final class HexViewer {
public final static void printFile(String filePath) {
File f;
try {
f = new File(filePath);
} catch (Exception e) {
return;
}
try {
FileInputStream fis = new FileInputStream(f);
while (fis.available() > 0) {
char[] line = new char[16];
for (int i=0; i < 16; i++) {
int readByte = fis.read();
String paddingZero = (readByte < 16) ? "0" : "";
System.out.print(paddingZero + Integer.toHexString(readByte) + " ");
line[i] = (readByte >= 33 && readByte <= 126) ? (char) readByte : ‘.’;
}
System.out.println(new String(line));
}
} catch (Exception e1) { e1.printStackTrace(); }
}
public final static void main(String[] args) {
if (args.length == 0)
return;
printFile(args[0]);
}
}
[/java]
Usage:
[bash]java HexViewer <path to file> | less[/bash]
[bash]java HexViewer Desktop/Puppet.wmv | less
30 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c 0&.u.f…….b.l
74 14 00 00 00 00 00 00 07 00 00 00 01 02 a1 dc t……………
ab 8c 47 a9 cf 11 8e e4 00 c0 0c 20 53 65 68 00 ..G………Seh.
00 00 00 00 00 00 f4 10 68 f9 49 76 2e 43 b5 9f ……..h.Iv.C..
09 0a 2d 19 45 7c 32 3a 24 00 00 00 00 00 70 ee ..-.E|2:$…..p.
14 06 fb da c7 01 28 01 00 00 00 00 00 00 00 8c ……(………
bb 53 00 00 00 00 10 88 dd 52 00 00 00 00 b8 0b .S…….R……
00 00 00 00 00 00 02 00 00 00 40 1f 00 00 40 1f ……….@…@.
00 00 90 50 02 00 b5 03 bf 5f 2e a9 cf 11 8e e3 …P….._……
00 c0 0c 20 53 65 61 10 00 00 00 00 00 00 11 d2 ….Sea………
d3 ab ba a9 cf 11 8e e6 00 c0 0c 20 53 65 06 00 …………Se..
33 10 00 00 a9 46 43 7c e0 ef fc 4b b2 29 39 3e 3….FC|…K.)9>
de 41 5c 85 27 00 00 00 00 00 00 00 01 00 0c 65 .A.’……….e
00 6e 00 2d 00 61 00 75 00 00 00 5d 8b f1 26 84 .n.-.a.u…]..&.
45 ec 47 9f 5f 0e 65 1f 04 52 c9 1a 00 00 00 00 E.G._.e..R……
00 00 00 02 01 ea cb f8 c5 af 5b 77 48 84 67 aa ……….[wH.g.
8c 44 fa 4c ca 62 01 00 00 00 00 00 00 06 00 00 .D.L.b……….
00 01 00 0c 00 02 00 02 00 00 00 49 00 73 00 56 ………..I.s.V
00 42 00 52 00 00 00 00 00 00 00 01 00 34 00 00 .B.R………4..
00 06 00 00 00 44 00 65 00 76 00 69 00 63 00 65 …..D.e.v.i.c.e
00 43 00 6f 00 6e 00 66 00 6f 00 72 00 6d 00 61 .C.o.n.f.o.r.m.a
00 6e 00 63 00 65 00 54 00 65 00 6d 00 70 00 6c .n.c.e.T.e.m.p.l
00 61 00 74 00 65 00 00 00 4c 00 31 00 00 00 00 .a.t.e…L.1….
00 02 00 0c 00 02 00 02 00 00 00 49 00 73 00 56 ………..I.s.V
00 42 00 52 00 00 00 01 00 00 00 02 00 34 00 00 .B.R………4..
00 0c 00 00 00 44 00 65 00 76 00 69 00 63 00 65 …..D.e.v.i.c.e
00 43 00 6f 00 6e 00 66 00 6f 00 72 00 6d 00 61 .C.o.n.f.o.r.m.a
00 6e 00 63 00 65 00 54 00 65 00 6d 00 70 00 6c .n.c.e.T.e.m.p.l
00 61 00 74 00 65 00 00 00 4d 00 50 00 40 00 4d .a.t.e…M.P.@.M
00 4c 00 00 00 00 00 01 00 2e 00 03 00 04 00 00 .L…………..
00 57 00 4d 00 2f 00 57 00 4d 00 41 00 44 00 52 .W.M./.W.M.A.D.R
00 43 00 50 00 65 00 61 00 6b 00 52 00 65 00 66 .C.P.e.a.k.R.e.f
00 65 00 72 00 65 00 6e 00 63 00 65 00 00 00 a7 .e.r.e.n.c.e….
3f 00 00 00 00 01 00 34 00 03 00 04 00 00 00 57 ?……4…….W
00 4d 00 2f 00 57 00 4d 00 41 00 44 00 52 00 43 .M./.W.M.A.D.R.C
00 41 00 76 00 65 00 72 00 61 00 67 00 65 00 52 .A.v.e.r.a.g.e.R
00 65 00 66 00 65 00 72 00 65 00 6e 00 63 00 65 .e.f.e.r.e.n.c.e
00 00 00 b0 06 00 00 74 d4 06 18 df ca 09 45 a4 …….t……E.
ba 9a ab cb 96 aa e8 a4 0d 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
[/bash]
This how it looks on a full blown hex editor like HexEdit:
The Code of HexViewer.java on emacs:
Homework
Hack the code so that it ouputs the first column shown on the HexEdit screenshot. That column represents the byte position of each row. It’s basically a counter incremented 16 units at the time, and shown in Hex.