Jak obliczyć CRC32 z Pythona, aby dopasować wyniki online?


Próbuję obliczyć/wygenerować skrót CRC32 z niektórych losowych ciągów za pomocą Pythona, ale nie pasują one do wartości generowanych przeze mnie ze źródeł online. To właśnie robię na moim komputerze,
>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829

Inne podejście,
>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829

Fakt, że powyższe wyniki są identyczne, mówi mi, że wywołuję funkcję poprawnie. Ale jeśli przejdę do następujących źródeł internetowych,

W przypadku ciągu „hello-world” wszystkie mają tę samą wartość = b1d4025b
Czy ktoś wie, co muszę zrobić, aby uzyskać odpowiednie wyniki?
Kiedy pisałem to pytanie, przyszło mi do głowy, że może być konieczne przekonwertowanie mojego wyniku Pythona na szesnastkowy.
>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'

Niestety to też nie pomogło. :(
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Python tworzy podpisane 32-bitowe CRC.
Te witryny wykonują 32-bitowe CRC bez znaku.
W przeciwnym razie znaczenia są takie same, jak widać z tego:
>>> 0x100000000 - 0xb1d4025b == 0x4e2bfda5
True

Jednym z szybkich sposobów konwersji z 32-bitowej na 32-bitową liczbę całkowitą jest: *
<sup>
</sup>
>>> -1311505829 % (1<<32)
2983461467

Lub szesnastkowo:
>>> hex(-1311505829 % (1<<32))
'0xb1d4025b'

& amp; 0xFFFFFFFF
lub
% 0x100000000
lub
& amp; (2 ** 32-1)
,
% (2 ** 32)
i tak dalej są równoważnymi sposobami wykonania tej samej rotacji bitów; wszystko sprowadza się do tego, który z nich jest najbardziej czytelny.
<sub>
* Działa to tylko w językach, które wykonują dzielenie liczb całkowitych w podłodze, takich jak Python (
-3// 2 == -2
); w językach, w których dzielenie liczb całkowitych jest obcięte, np. Java (
-3/2 == -1
), nadal otrzymujesz liczbę ujemną. A w językach, które nawet nie wymagają Split i Mod do prawidłowego dopasowania, jak C, wszystkie zakłady są anulowane - ale w C po prostu rzucasz bajty na właściwy typ
</sub>

Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dokumentacja Zlib.crc32
https://docs.python.org/3/libr ... crc32
sugeruje użycie następującego podejścia „w celu wygenerowania tej samej wartości liczbowej we wszystkich wersjach i platformach Pythona”.
import zlib
hex(zlib.crc32(b'hello-world') & 0xffffffff)

Wynik to
0xb1d4025b
zgodnie z oczekiwaniami.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wygląda na to, że Python zwraca liczbę całkowitą ze znakiem (stąd liczba ujemna), podczas gdy inne zwracają liczbę całkowitą bez znaku.
Próbowałem użyć modułu z 2 ^ 32 i dawał taką samą wartość jak te strony.
>>> hex(zlib.crc32('hello-world')% 2**32)) 
'0xb1d4025b'

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się