Traduzir código do C para python

2,559 views
Skip to first unread message

Junior Phanter

unread,
Aug 21, 2014, 11:17:29 PM8/21/14
to python...@googlegroups.com
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:
pastebin

def 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
41DB20FF

já 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?


Fabio C. Barrionuevo da Luz

unread,
Aug 21, 2014, 11:47:52 PM8/21/14
to python...@googlegroups.com
++ e -- é respectivamente incremento e decremento de 1 na variável, ou seja, por exemplo em linguagem C:

count++;

é exatamente o mesmo que:



--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio C. Barrionuevo da Luz
Acadêmico de Sistemas de Informação na Faculdade Católica do Tocantins - FACTO
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Junior Phanter

unread,
Aug 22, 2014, 12:21:41 AM8/22/14
to python...@googlegroups.com
Obrigado pelo retorno Fabio :)
hum... como count+=1 em python, correto?
porém em C, o count++ está dentro de string[count++], em python, isso equivale a for count in string: ou algo do tipo for count in len(string)?

estou sem entender como transformar isso em python... pois string[count+=1] deu erro aqui... então cheguei a conclusão que os [] tem outra função no C... então pelo o que eu entendi é que string[n] em C é uma lista vazia com n espaços vazios, por isso que em crctab[255-table] = crc eu traduzi para:


        crctab=[]
        for g in range(256):
                crctab.append('')
aí sim fazer crctab[255-table] = crc

Não sei se está correto...

desde já, agradeço...

Linux - Junior Polegato

unread,
Aug 22, 2014, 7:59:42 AM8/22/14
to python...@googlegroups.com
Em 22-08-2014 01:21, Junior Phanter escreveu:
Obrigado pelo retorno Fabio :)
hum... como count+=1 em python, correto?
porém em C, o count++ está dentro de string[count++], em python, isso equivale a for count in string: ou algo do tipo for count in len(string)?

Bom dia!

        Os operadores ++ e -- de C executam um instrução do processado que é incremento e decremento, e se vier antes da variável, faz isso antes de executar a linha, senão faz depois de executar a linha.

        Em Python não tem isso, então se vier antes, tem que fazer count [+-]= 1 numa linha antes, senão faz numa linha depois.

        Contudo, traduzir código ao pé da letra, linha por linha, é meio complicado, o ideal é conhecer o algoritmo e então utilizar os recursos da linguagem para melhor atender este algoritmo.


--

[]'s

Junior Polegato

Danillo Souza

unread,
Aug 22, 2014, 9:09:44 AM8/22/14
to python...@googlegroups.com

Em 22 de agosto de 2014 01:21, Junior Phanter <junior...@gmail.com> escreveu:
porém em C, o count++ está dentro de string[count++], em python, isso equivale a for count in string: ou algo do tipo for count in len(string)?



Em Python, string[count++] ficaria:

string[count]
count += 1

Os operadores de incremento e decremento(++ e --) tem um detalhe: quando são usados antes da variável, eles incrementam seu valor antes que sejam usadas, e quando são postos depois dela, incrementam(ou decrementam) após o valor da variável ser utilizada. Por exemplo:

int a = 10;
int c = ++a; // c => 11, a => 11
int d = a++; // d => 11, a => 12

Isso ocorre não só em C, mas em qualquer linguagem(pelo menos que eu saiba) que implementa esses operadores de incremento e decremento.

Fabio C. Barrionuevo da Luz

unread,
Aug 22, 2014, 9:11:59 AM8/22/14
to python...@googlegroups.com

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Fabio C. Barrionuevo da Luz

unread,
Aug 22, 2014, 9:13:01 AM8/22/14
to python...@googlegroups.com
Danilo, não seria ao contrario

Em Python, string[count++] ficaria:

count += 1
string[count]

Danillo Souza

unread,
Aug 22, 2014, 9:14:00 AM8/22/14
to python...@googlegroups.com
Em 22 de agosto de 2014 01:21, Junior Phanter <junior...@gmail.com> escreveu:
porém em C, o count++ está dentro de string[count++], em python, isso equivale a for count in string: ou algo do tipo for count in len(string)?


Se você quer percorrer a string tendo também os índices em cada iteração, faça de um jeito mais pythônico. Ex:

...
for i, c in enumerate(string):
    print "[%d] %s" % (i, c)
...

Danillo Souza

unread,
Aug 22, 2014, 9:14:58 AM8/22/14
to python...@googlegroups.com
Fabio, o operador de incremento, no caso, é pós-fixo, então ele só incrementaria o count depois de usar seu valor atual como índice.

Linux - Junior Polegato

unread,
Aug 22, 2014, 10:36:59 AM8/22/14
to python...@googlegroups.com
Em 22-08-2014 00:17, Junior Phanter escreveu:
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

Olá!

        C foi feito pensando em escovar bits, com o tempo adaptado a um nível superior, um pouco mais com C++, mas nada tão alto nível como o Python, que perdeu em si o conceito em C de deixar o usuário escovar bits e administrar a memória.

        Assim sendo, veja como seria traduzir para Python em:

https://gist.github.com/JuniorPolegato/c1c2e1270e52945e22c6

--

[]'s

Junior Polegato

Junior Phanter

unread,
Aug 22, 2014, 2:11:26 PM8/22/14
to python...@googlegroups.com
Obrigado Fabio, Danillo e Junior Polegato pela explicação e ajuda...

O código auto-explicativo do Junior Polegato está esclarecendo as sutis diferenças entre C e python... Parabéns...

Adianto que o código do Junior Polegato está funcionando primorosamente.


--

Junior Phanter

unread,
Oct 8, 2014, 12:15:49 AM10/8/14
to python...@googlegroups.com
Olá comunidade... Estou retornando aqui para apresentar um retorno ao início dessa thread. Primeiramente queria expor um depoimento com o intuito de encorajar os iniciantes na linguagem python. Assim como muitos, ainda sou iniciante, porém a cada dia dou passos mais largos, graças a linguagem python e a ótima comunidade. Bem, eu não tenho formação universitária, não fiz curso algum de programação, e apesar disso, com o material presente na internet, com a ajuda da comunidade, me foi possível desenvolver um programa totalmente funcional, multiplataforma (ainda não testei no OSX).
Tenho consciência que minha codificação não está pythonica, aliás, tá uma bagunça... (kkkkk), mas até agora está funcionando, então estou satisfeito... Notei que o meu aprendizado foi muito mais intenso ao embarcar nesse projeto, na finalização do mesmo, a evolução da técnica aprendida me fez questionar o que eu ja havia feito, ou seja, notei que eu poderia ter iniciado a codificação de uma forma melhor, ter otimizado mais... Em fim... gostaria de agradecer a todos que me ajudaram diretamente e indiretamente. Muito obrigado....

Apresento-lhes agora os frutos...

https://github.com/PhanterJR/PhanterPS2

Depois de estudar um pouco o py2exe e o NSIS, resultou nessa versão para Ruindows, com instalador e tudo...

http://www.conexaodidata.com.br/phanterps2

testado no CentOS 6.5
Windows XP, Windows 7 e Windows 8
Em anexo vai alguns prints

LINUX CENTOS





WINDOWS




Renzo Nuccitelli

unread,
Oct 8, 2014, 9:09:34 AM10/8/14
to python...@googlegroups.com
​Parabéns Junior. Também sou do tipo que aprende muito mais colocando a mão na massa.​

Em 8 de outubro de 2014 01:15, Junior Phanter <junior...@gmail.com> escreveu:
notei que eu poderia ter iniciado a codificação de uma forma melhor, ter otimizado mais...

​Fique acostumado. Isso acontece sempre, e não só no início. Toda vez que pego um código antigo, e não precisa ser muito antigo, vejo que poderia ter melhorado. 

Abs,​


--
  Renzo Nuccitelli

Linux - Junior Polegato

unread,
Oct 8, 2014, 11:01:34 AM10/8/14
to python...@googlegroups.com
Olá!

        Parabéns! Continue assim que está no caminho certo 8-)


--

[]'s

Junior Polegato

Danillo Souza

unread,
Oct 8, 2014, 11:29:55 AM10/8/14
to python...@googlegroups.com
Parabéns pelo projeto cara!

Realmente, nenhum livro ou tutorial vai te ensinar tanto quanto começar um projeto e ter que solucionar problemas reais.
Sucesso nos estudos.

[]'s

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Reply all
Reply to author
Forward
0 new messages