如何从文件中读取两位数字,与(0x91)异或并打印到屏幕?

1 投票
3 回答
1251 浏览
提问于 2025-04-17 07:32

我想读取一个以十六进制写的字节文件,比如说: (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

这个算法其实很简单:

  1. 每次读取两个字符
  2. 把这两个字符转换成一个整数
  3. 用你的掩码(0x91)对这个整数进行异或运算
  4. 再把这个整数转换回带前导零的十六进制字符串

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)

撰写回答