Математическая операция с 16b hex в Python - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть начальный гекс: "00000000FFFFFFFF000000000AF50AF5" на этом я хочу выполнить некоторые операции.
Пользователь вводит значение типа int (20 для примера).
Программа делает: ввод * 100. (= 2000)
Преобразуйте его в «Hex Little Endian» (= D0070000)
Замените первые 4 байта (00000000) новыми 4 байтами: (= D0070000FFFFFFFF000000000AF50AF5)
Пока здесь это хорошо! Проблемы начинаются сейчас.
Замените этот же гекс (= D0070000) в третьей позиции 4 байта (00000000): (= D0070000FFFFFFFFD00700000AF50AF5)
И, наконец, вычтите этот же гекс (= D0070000) во второе положение 4 байта (FFFFFFFF): (= 2FF8FFFF)
Конечный гекс: "D00700002FF8FFFFD00700000AF50AF5"

Я не понимаю, как я могу указать в моей программе положение 4 байта (1,2,3 или 4) для замены.

user_int_value=int(input("enter num: "))*100 #user input*100
start_hex=bytes.fromhex("00000000FFFFFFFF000000000AF50AF5") #Starting hex
num_tot=hex(int.from_bytes(user_int_value.to_bytes(16, 'little'), 'big')) #convert user input to hex in little endian
sum = hex(int('0xFFFFFFFF', 16) - int(num_tot, 16)) #substract same hex to "0xFFFFFFFF"

EDIT

Проще говоря, я хочу объединить 4 байта:

data = ["0xD0070000", "0x2FF8FFFF", "0xD0070000", "0x0AF50AF5"]

окончательный результат хочу "0xD00700002FF8FFFFD00700000AF50AF5"

1 Ответ

0 голосов
/ 14 апреля 2019

Попробуйте это:

data = ["0xD0070000", "0x2FF8FFFF", "0xD0070000", "0x0AF50AF5"]
output = hex(int(data[0], 16) << 96 | int(data[1], 16) << 64 | int(data[2], 16) << 32 | int(data[3], 16) << 0)

вывод должен стать 0xd00700002ff8ffffd00700000af50af5

В некоторых случаях вы не получите ожидаемый результат, поскольку ведущие нули будут обрезаны, в этом случае вы можете заполнить нули вручную, выполнив:

print(f"0x{output[2:].zfill(32)}") # Uses f-string (requires newer python versions)

или

print("0x{}".format(output[2:].zfill(32))) # uses the old python format's string method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...