Как прочитать две цифры из файла, XOR его с (0x91) и распечатать на экране? - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь прочитать файл байтов, записанных в шестнадцатеричном формате, например: (909090), который не nop nop nop в сборке, я хочу xor каждые две цифры в виде байта с 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 ]

3 голосов
/ 02 декабря 2011

Необходимый алгоритм довольно прост:

  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)
2 голосов
/ 02 декабря 2011

Чтобы отформатировать число в виде шестнадцатеричных символов, используйте встроенную функцию hex () .

>>> hex(10)
'0xa'
>>> hex(100)
'0x64'
1 голос
/ 02 декабря 2011

Как компактный однострочный:

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)
...