On Fri, 2015-07-24 at 10:01 +0200, Jakub Jelinek wrote:
> #!/usr/bin/python
> import sys
> with open(sys.argv[1],"rb") as f:
>     nextblock = f.read(12)
>     while 1:
>         block = nextblock
>         nextblock = f.read(12)
>         if block == "":
>             break
>         str = ""
>         for ch in block:
>             if str == "":
>                 str = "  "
>             else:
>                 str += ", "
>             if ord(ch) < 10:
>                 str += "0x0" + chr(ord('0')+ord(ch))
>             elif ord(ch) < 16:
>                 str += "0x0" + chr(ord('a')+ord(ch)-10)
>             else:
>                 str += hex(ord(ch))
>         if nextblock != "":
>             str += ","
>         print str
> 
>         python ./xxd.py $< >> $@
> does the same thing as
>         cat $< | xxd -include >> $@
> (CCing David as python expert, my python knowledge is limited and
> 15 years old, not sure how portable this is (python 2 vs. python 3,
> and
> even python 2 minimal versions)).

It doesn't work with Python 3 for various reasons ("print" syntax, and
str vs bytes issues).

I'm attaching a version which works with both Python 2 and Python 3
(2.7.5 and 3.3.2 were the versions I tried).

It ought to work with much older python 2 versions (as your script
appears to), but I don't have them handy.

Presumably it would need a license header and some descriptive comments.

(snip)

Dave
#!/usr/bin/python
import sys

if sys.version_info[0] == 2:
    # Python 2:
    # 'block' below is an instance of str; iterating over it gives us
    # str instances of len 1.
    def get_byte(ch):
        return ord(ch)
else:
    # Python 3:
    # 'block' below is an instance of bytes; iterating over it gives us
    # instances of int, in the range 0-255.
    def get_byte(ch):
        return ch

with open(sys.argv[1],"rb") as f:
    nextblock = f.read(12)
    while 1:
        block = nextblock
        nextblock = f.read(12)
        if not block:
            break
        str = ""
        for item in block:
            byte = get_byte(item)
            if str == "":
                str = "  "
            else:
                str += ", "
            if byte < 10:
                str += "0x0" + chr(ord('0')+byte)
            elif byte < 16:
                str += "0x0" + chr(ord('a')+byte-10)
            else:
                str += hex(byte)
        if nextblock:
            str += ","
        print(str)

Reply via email to