April 20, 2012 2 Responses

Hexdump a ByteArray

Here is a class to hexdump a ByteArray to a string inspired by HxD

1
2
3
4
5
6
7
8
9
10
 var ba:ByteArray = new ByteArray();
 ba.writeByte(0x0a);
 ba.writeByte(0x0a);
 ba.writeByte(0x0a);
 ba.writeUTFBytes("Testdump")
 for (var i:int = 0; i < 80; i++)
 {
   ba.writeByte(int(Math.random()*0x50));
 }
 trace(HexDump.dump(ba));
 var ba:ByteArray = new ByteArray();
 ba.writeByte(0x0a);
 ba.writeByte(0x0a);
 ba.writeByte(0x0a);
 ba.writeUTFBytes("Testdump")
 for (var i:int = 0; i < 80; i++)
 {
   ba.writeByte(int(Math.random()*0x50));
 }
 trace(HexDump.dump(ba));

will output

1
2
3
4
5
6
7
Offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 0A 0A 0A 54 65 73 74 64 75 6D 70 06 0B 27 3D 3B ...Testdump..'=;
00000010 4C 2D 39 22 46 43 1E 20 03 0E 33 1F 07 10 30 17 L-9"FC. ..3...0.
00000020 15 10 3A 19 43 1D 16 3B 02 4F 26 08 25 0C 3E 0B ..:.C..;.O&.%.>.
00000030 37 2A 3E 33 42 2A 2F 04 35 0F 0E 29 06 2E 40 36 7*>3B*/.5..)..@6
00000040 3F 13 14 1C 33 4D 46 40 41 2B 1C 03 3E 3F 1D 3B ?...3MF@A+..>?.;
00000050 2E 3D 21 15 17 42 2E 48 12 37 49                .=!..B.H.7I
Offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 0A 0A 0A 54 65 73 74 64 75 6D 70 06 0B 27 3D 3B ...Testdump..'=;
00000010 4C 2D 39 22 46 43 1E 20 03 0E 33 1F 07 10 30 17 L-9"FC. ..3...0.
00000020 15 10 3A 19 43 1D 16 3B 02 4F 26 08 25 0C 3E 0B ..:.C..;.O&.%.>.
00000030 37 2A 3E 33 42 2A 2F 04 35 0F 0E 29 06 2E 40 36 7*>3B*/.5..)..@6
00000040 3F 13 14 1C 33 4D 46 40 41 2B 1C 03 3E 3F 1D 3B ?...3MF@A+..>?.;
00000050 2E 3D 21 15 17 42 2E 48 12 37 49                .=!..B.H.7I

This is the HexDump Class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package
{
    import flash.utils.ByteArray;
 
    /**
    * @author Björn Acker | www.bjoernacker.de
    */
    public class HexDump
    {
 
        public static function dump(buffer:ByteArray):String
        {
            var out:String = fillUp("Offset", 8, " ") + "  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n";
            var offset:int = 0;
            var l:int = buffer.length;
            var row:String = "";
            buffer.position = 0;
            for (var i:int = 0; i < l; i += 15)
            {
                row += fillUp(offset.toString(16).toUpperCase(), 8, "0") + "  ";
                var n:int = Math.min(16, buffer.length - buffer.position);
                var string:String = "";
                for (var j:int = 0; j < 16; ++j)
                {
                    if (j < n)                     
                    {
                        var value:int = buffer.readUnsignedByte();
                        string += value >= 32 ? String.fromCharCode(value) : ".";
                        row += fillUp(value.toString(16).toUpperCase(), 2, "0") + " ";
                        offset++;
                    }
                    else
                    {
                        row += "   ";
                        string += " ";
                    }
                }
                row += " " + string + "\n";
            }
            out += row;
            return out;
        }
 
        private static function fillUp(value:String, count:int, fillWith:String):String
        {
            var l:int = count - value.length;
            var ret:String = "";
            while (--l > -1)
            ret += fillWith;
            return ret + value;
        }
    }
}
package
{
    import flash.utils.ByteArray;

    /**
    * @author Björn Acker | www.bjoernacker.de
    */
    public class HexDump
    {

        public static function dump(buffer:ByteArray):String
        {
            var out:String = fillUp("Offset", 8, " ") + "  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n";
            var offset:int = 0;
            var l:int = buffer.length;
            var row:String = "";
            buffer.position = 0;
            for (var i:int = 0; i < l; i += 15)
            {
                row += fillUp(offset.toString(16).toUpperCase(), 8, "0") + "  ";
                var n:int = Math.min(16, buffer.length - buffer.position);
                var string:String = "";
                for (var j:int = 0; j < 16; ++j)
                {
                    if (j < n)                     
                    {
                        var value:int = buffer.readUnsignedByte();
                        string += value >= 32 ? String.fromCharCode(value) : ".";
                        row += fillUp(value.toString(16).toUpperCase(), 2, "0") + " ";
                        offset++;
                    }
                    else
                    {
                        row += "   ";
                        string += " ";
                    }
                }
                row += " " + string + "\n";
            }
            out += row;
            return out;
        }

        private static function fillUp(value:String, count:int, fillWith:String):String
        {
            var l:int = count - value.length;
            var ret:String = "";
            while (--l > -1)
            ret += fillWith;
            return ret + value;
        }
    }
}

Filed in AS3, Flash

2 Responses

  1. Someone on April 20, 2012, 9:36 pm

    Nice! But you should use readUnsignedByte() at #27.

  2. bma on April 21, 2012, 7:51 am Author

    You’re right! Fixed it… Thank you.