Kafamdaki CRC32 hesaplamalarını baştan çıkarmaya çalışıyorum, elde ettiğim değerler, almam gerekenlerle uyuşmuyor.Python'da kütüphaneleri kullanmadan CRC32 hesaplaması
Python'un bu sağlama toplamlarını (yani, zlib ve binascii) oluşturabilen kitaplıklara sahip olduğunun farkındayım, ancak mikroişlemde CRC işlevselliği olmadığından bunları kullanabilme lüksüne sahip değilim.
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))
Sonra aşağıdaki çıktıyı almak: benim bir değil yaptığı gibi
binascii calc: 0xd87f7e0c
zlib calc: 0xd87f7e0c
my calc: 0x2780810c
binascii ve zlib hesapları uyuyor
Şimdiye kadar aşağıdaki kodu var. Nette bulunan örneklerle karşılaştırdığım için hesaplanan bayt tablosunun doğru olduğuna inanıyorum. Yani konu her baytın hesaplandığı rutin olmalı, kimse bana doğru yönde işaret edebilir mi?
Şimdiden teşekkürler!
Siz bir tanrı efendisiniz, hızlı cevap ve çözümünüz için çok teşekkür ederim! – Cooper
@Cooper Merak etme. Benim tweak% 100 emin değilim (bitwise işlemleri ile aritmetik karıştırma nedeniyle). İşi doğru yapmak için _appears_, ama biraz köşe kaygısında yanlış cevap verdiğinden biraz endişeliyim. OTOH, '' xff \ xff \ xff \ xff '' kelimesini geçtiğinde 'ffffffff' döndürdüğünü kontrol ettim, bu iyi bir işaret. :) –
@Cooper Bu ek testlerden sonra, güvenim arttı. :) Herhangi bir girdi için yanlış sonuç döndürürse _very_ şaşırmış olurdum. –