如何从文件中读取两位数字,与(0x91)异或并打印到屏幕?
我想读取一个以十六进制写的字节文件,比如说: (909090),在汇编语言中,这代表的是 nop nop nop。我想把每两个数字当作一个字节,与 0x91 进行异或运算。
我该如何以十六进制的形式打印出这个值呢?现在打印出来的只是一些没有意义的数字。
总的来说,我想为我的汇编代码制作一个打包工具。
def add_prefix(a):
a = str(a)
a = '0x' + a
a = int(a, 16)
return a
fr = open('C:\code.txt', 'r')
word = ''
b = ''
for line in fr:
b += line
count = 0
for char in b:
char = str(char)
word += char
if count%2 == 0:
word = int(str(add_prefix(word)^91), 16)
print word
word = ""
3 个回答
1
这是一个简洁的一行代码:
print "".join(["%02x" % (ord(c) ^ 0x91) for c in open(file_path).read().decode("hex")])
或者你可以看一个更易读的版本:
with open(file_path) as f:
for line in f:
for char in line.rstrip().decode("hex"):
byte = ord(char)
print "%02x" % (byte ^ 0x91)
2
要把一个数字格式化成十六进制字符,可以使用内置的 hex() 函数。
>>> hex(10)
'0xa'
>>> hex(100)
'0x64'
3
这个算法其实很简单:
- 每次读取两个字符
- 把这两个字符转换成一个整数
- 用你的掩码(
0x91
)对这个整数进行异或运算 - 再把这个整数转换回带前导零的十六进制字符串
with open(file_path, 'r') as fp:
result = []
while True:
# 1.
s = fp.read(2)
if not s:
break
# 2.
number = int(s, 16) # No need for '0x' prefix!
# 3.
number = number ^ 0x91 # '91' needs '0x' prefix!
# 4.
result.append(format(number, '02x'))
print ''.join(result)