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)