Olá comunidade, estou tentando traduzir um código em C para python, porém não sei nada de C (aliás, ainda sei pouco de python), eu tentei fazer alguma coisa, mas ainda não consegui solucionar, eis aí o código C:
pastebin u32 crc32(const char *string)
{
int crc, table, count, byte;
for (table=0; table<256; table++) {
crc = table << 24;
for (count=8; count>0; count--) {
if (crc < 0) crc = crc << 1;
else crc = (crc << 1) ^ 0x04C11DB7;
}
crctab[255-table] = crc;
}
do {
byte = string[count++];
crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00);
} while (string[count-1] != 0);
return crc;
}
======================================
Com o pouco que eu sei se python, eu fix o seguinte:
pastebindef crc32(string):
count=8
crctab=[]
for g in range(256):
crctab.append('')
for table in range(256):
crc = table << 24
while count>0:
if crc < 0:
crc = crc << 1
else:
crc = (crc << 1 ) ^ 0x04C11DB7
count -= 1
crctab[255-table] = crc
for count in string:
byte = ord(count)
crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00)
return crc
=============================================
O que eu não estou entendendo em C é o:
do {
byte =
string[count++]; < --------------- "não entendi isso'
crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00);
} while (string[count-1] != 0);
então eu python eu fiz:
for count in string:
byte = ord(count) #<----------------------- Aqui eu tive que adicionar o ord() para retornar um inteiro, pois sem isso dá erro na linha seguinte
crc
= crctab
[byte ^
((crc
>> 24) &
0xFF)] ^
((crc
<< 8) &
0xFFFFFF00)
Com o que eu tenho em C ao fazer isso:
printf("%08X",crc32("BLACK"));
reproduz
41DB20FFjá com o código que eu tenho não dá esse o resultado...
Já tentei usar o zlib.crc32, binascii.crc32 sem sucesso...
alguém pode me dar uma luz?