Вычислить контрольную сумму для двоичного файла в Python

1

У меня есть двоичный файл (2 байта), содержимое которого в шестнадцатеричном формате выглядит следующим образом:

00 00 00 DD 11 22 33 44

В двоичном виде содержимое выглядит следующим образом (маленький конец):

11011101 00000000 00000000 00000000 01000100 00110011 00100010 00010001 

Я хочу вручную вычислить контрольную сумму файла и добавить его в конец файла. Для вычислений я рассматриваю 4 байта за один раз.

Затем шаги руководства должны выглядеть следующим образом:

   11011101 00000000 00000000 00000000
+ 
   01000100 00110011 00100010 00010001
  --------------------------------------
=  00100001 00110011 00100010 00010001

   11011110 11001100 11011101 11101110  (1 complement)
+
   00000000 00000000 00000000 00000001  (add 1) <br/>
-----------------------------------------
=  11011110 11001100 11011101 11101111  (2 complement) = CheckSum

Пожалуйста, поправьте меня, если я неправильно вычислил контрольную сумму. Код, который я написал для вычисления контрольной суммы в системе, не работает нормально.

add = 0
with open("temp.bin", "rb") as f:
    ## Read first 4 bytes of data
    byte = f.read(4)
    while byte != "":
        add += int.from_bytes(byte, byteorder="little")
    print(b"%02X" % (~add & 0xFFFFFFFF))

Пожалуйста, помогите мне с вышеуказанной проблемой и кодом.

  • 0
    Разве контрольная сумма не должна быть производной от результата XOR? Кстати: вот функция дополнения до двух в Python: en.wikipedia.org/wiki/Two%27s_complement
  • 0
    Вы должны использовать эту конкретную контрольную сумму? Было бы быстрее использовать одну из стандартной библиотеки (adler32 или crc32), так как они работают на скорости C.
Теги:
checksum

1 ответ

2
Лучший ответ

Вы не обновляя byte в вашем в while цикла, поэтому цикл никогда не заканчивается.

Вы должны продолжать читать от f до byte не None:

add = 0
with open("/temp/test.py", "rb") as f:
    ## Read first 4 bytes of data
    while True:
        byte = f.read(4)
        if not byte:
            break
        add += int.from_bytes(byte, byteorder='little')
    print(b'%02X' % (~add & 0xFFFFFFFF))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню