[Python-talk] How to print a bunch o bytes in hex?

Ric Werme ewerme at comcast.net
Wed Sep 23 21:16:55 EDT 2009


> Is there a simple way to print bytes that have been received from a 
> network?
> I just want to print out the hex representation of the bytes...
> 
> Right now the bytes are in a string, printing that results in unprintable 
> or unrecognizable characters.
> 
> 00 89 af b9 ...

I know you deal with floating point,  but if you have some ascii
kicking around too, here's some uncommented code I wrote ages ago
for the second or third time (not counting C or PDP-10 assembler
variants).

tux:delorme> python dump_hex.py
0000   00 01 02 03  04 05 06 07   08 09 0a 0b  0c 0d 0e 0f *................*
0010   10 11 12 13  14 15 16 17   18 19 1a 1b  1c 1d 1e 1f *................*
0020   20 21 22 23  24 25 26 27   28 29 2a 2b  2c 2d 2e 2f * !"#$%&'()*+,-./*
0030   30 31 32 33  34 35 36 37   38 39 3a 3b  3c 3d 3e 3f *0123456789:;<=>?*
0040   40 41 42 43  44 45 46 47   48 49 4a 4b  4c 4d 4e 4f *@ABCDEFGHIJKLMNO*
0050   50 51 52 53  54 55 56 57   58 59 5a 5b  5c 5d 5e 5f *PQRSTUVWXYZ[\]^_*
0060   60 61 62 63  64 65 66 67   68 69 6a 6b  6c 6d 6e 6f *`abcdefghijklmno*
0070   70 71 72 73  74 75 76 77   78 79 7a 7b  7c 7d 7e 7f *pqrstuvwxyz{|}~.*
0080   80 81 82 83  84 85 86 87   88 89 8a 8b  8c 8d 8e 8f *................*
0090   90 91 92 93  94 95 96 97   98 99 9a 9b  9c 9d 9e 9f *................*
00a0   a0 a1 a2 a3  a4 a5 a6 a7   a8 a9 aa ab  ac ad ae af *................*
00b0   b0 b1 b2 b3  b4 b5 b6 b7   b8 b9 ba bb  bc bd be bf *................*
00c0   c0 c1 c2 c3  c4 c5 c6 c7   c8 c9 ca cb  cc cd ce cf *................*
00d0   d0 d1 d2 d3  d4 d5 d6 d7   d8 d9 da db  dc dd de df *................*
00e0   e0 e1 e2 e3  e4 e5 e6 e7   e8 e9 ea eb  ec ed ee ef *................*
00f0   f0 f1 f2 f3  f4 f5 f6 f7   f8 f9 fa fb  fc fd fe ff *................*

tux:delorme> cat dump_hex.py
import sys

def dump_hex(msg, start=0, length=0):
    if start >= len(msg):
        return
    if length == 0 or start + length > len(msg):
        length = len(msg) - start
    off = start
    while length > 0:
        sys.stdout.write('%04x' % off)
        text = ' *'
        for i in range(min(16, length)):
            value = msg[off + i]
            if (i & 0x7) == 0:
                sys.stdout.write(' ')
            if (i & 0x3) == 0:
                sys.stdout.write(' ')
            sys.stdout.write(' %02x' % value)
            if value >= 32 and value < 127:
                text += chr(value)
            else:
                text += '.'
        sys.stdout.write(text)
        sys.stdout.write('*\n')
        off += 16
        length -= 16
    print


if __name__ == '__main__':
    s = []
    for i in range(256):
        s.append(i)
    dump_hex(s)



More information about the Python-talk mailing list