📄 hex2bin.py
字号:
import sys
DEBUG = 0
class ConversionError(Exception):
def __init__(self,line_num,line):
self.line_num=line_num
self.line=line
def take(iterable,n) :
it=iter(iterable)
out=[]
for i in xrange(n) :
out.append(it.next())
return out
def gen_int_from_ascii_hex(str): # whole string in '%2x' format
it=iter(str)
while 1 :
c = it.next()
c += it.next()
if not c.isalnum() :
return
yield int(c,16)
def hex2bin(lines,size,initial_value=0) :
bin_image=[initial_value]*size
bin_image_actual_len=0
for (line_num,line) in enumerate(lines) :
if line[0] != ':' :
raise ConversionError(line_num,line)
if DEBUG: print >> sys.stderr, 'header=%s' % \
[ x for x in gen_int_from_ascii_hex(line[1:]) ]
contents = gen_int_from_ascii_hex(line[1:])
#try :
header = take(contents,4)
if DEBUG: print >> sys.stderr, 'header=%s' % header
(count,addr_hi,addr_lo,code_type) = tuple(header)
if DEBUG: print >> sys.stderr, \
'count=%d,addr_hi=%d,addr_lo=%d,code_type=%d' \
% (count,addr_hi,addr_lo,code_type)
address = addr_hi*256 + addr_lo
if DEBUG: print >> sys.stderr, 'address=', address
code = take(contents,count)
file_check_sum=take(contents,1)[0]
#except :
# raise ConversionError(line_num,line)
check_sum = reduce(lambda x,y: x+y,header+code)
check_sum = -(check_sum & 0xff) & 0xff
if check_sum != file_check_sum :
#FIXME: mismatch, should have its own exception ?
if DEBUG: print>> sys.stderr, \
'hex2bin: checksum mismatch, %d (should_be=%d)'\
% (check_sum,file_check_sum)
raise ConversionError(line_num,line)
for i in xrange(count) :
bin_image[address+i]=code[i]
if address+count > bin_image_actual_len :
bin_image_actual_len=address+count
return ''.join([chr(x) for x in bin_image[:bin_image_actual_len]])
def main(argv = None) :
if argv == None:
argv = sys.argv[1:]
if len(argv):
fin = file(argv[0],'rb')
else:
fin = sys.stdin
try :
bin=hex2bin(fin,65536)
except ConversionError, e:
print >> sys.stderr, \
'hex2bin: unable to convert the following line:'
print >> sys.stderr, '%d: %s' \
% (e.line_num,e.line)
print >> sys.stderr, 'hex2bin: conversion failed, aborting'
sys.exit(1)
fin.close()
if len(argv) >= 2:
fout = file(argv[1],'wb')
else:
fout = sys.stdout
fout.write(bin)
fout.close()
if __name__ == '__main__' :
main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -