⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hex2bin.py

📁 8051 interrupt assemble code
💻 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 + -