나는 CRC32 계산을 많이하지 않고 내 머리를 잡으려고 노력했다. 내가 얻는 값이 내가 얻는 것과 일치하지 않는다.라이브러리를 사용하지 않고 파이썬에서 CRC32 계산
파이썬에는 이러한 체크섬 (즉, zlib 및 binascii)을 생성 할 수있는 라이브러리가 있지만, CRC 기능이 마이크로 파이썬에 존재하지 않으므로이를 사용할 수 없다는 점을 알고 있습니다.
import binascii
import zlib
from array import array
poly = 0xEDB88320
table = array('L')
for byte in range(256):
crc = 0
for bit in range(8):
if (byte^crc) & 1:
crc = (crc >> 1)^poly
else:
crc >>= 1
byte >>= 1
table.append(crc)
def crc32(string):
value = 0xffffffffL
for ch in string:
value = table[(ord(ch)^value) & 0x000000ffL]^(value >> 8)
return value
teststring = "test"
print "binascii calc: 0x%08x" % (binascii.crc32(teststring) & 0xffffffff)
print "zlib calc: 0x%08x" % (zlib.crc32(teststring) & 0xffffffff)
print "my calc: 0x%08x" % (crc32(teststring))
그런 다음 나는 다음과 같은 출력을 얻을 : 내 사람이하지 않는
binascii calc: 0xd87f7e0c
zlib calc: 0xd87f7e0c
my calc: 0x2780810c
binascii 및 ZLIB 계산이 동의
지금까지 나는 다음과 같은 코드가 있습니다. 나는 계산 된 바이트의 표가 정확한지를 생각한다. 따라서 문제는 각 바이트가 계산되는 루틴이어야하며 누군가 올바른 방향으로 나를 가리킬 수 있습니까?
미리 감사드립니다.
당신은 선생님입니다. 빠른 답장과 해결책을 보내 주셔서 대단히 감사합니다! – Cooper
@Cooper 걱정할 필요가 없습니다. 나는 100 % 비트 닝 연산을 이용한 산술 연산으로 인한 비틀기에 대해 확신하지 못한다. 제대로 작동하려면 _ 나타나지만, 어떤 경우에는 잘못된 대답을 줄 수도 있습니다. OTOH, 나는''\ xff \ xff \ xff \ xff ''를 넘겨 줄 때'ffffffff'를 리턴했음을 확인했다. 그래서 그것은 좋은 신호이다. :) –
@Cooper 이러한 추가 테스트가 끝나면 자신감이 높아졌습니다. :) 그것은 어떤 입력에 대해 잘못된 결과를 반환한다면 나는 놀랄 것입니다. –