Pergunta

Eu estou procurando uma implementação de CRC32 em C ou C ++ que é explicitamente licenciado como sendo sem qualquer custo ou de domínio público. A implementação aqui parece agradável, mas a única coisa que ele diz sobre a licença é "código fonte ", o que não é bom o suficiente. Eu prefiro não LGPL, então eu não tenho que brincar com um DLL (meu aplicativo é fechado). Eu vi a implementação Adler32 em zlib, mas estou verificando pequenos pedaços de dados, que Adler não é bom para.

Foi útil?

Solução

Use a impulso C ++ bibliotecas . Há um CRC incluído lá e o licença é bom.

Outras dicas

O SNIPPETS C Source Code Archive tem um CRC32 implementação , que é livremente utilizáveis:

/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or
   code or tables extracted from it, as desired without restriction.*/

(Infelizmente, c.snippets.org parece ter morrido. Felizmente, o Wayback Machine tem arquivado .)

De modo a ser capaz de compilar o código, você vai precisar adicionar typedefs para BYTE como um inteiro de 8 bits sem sinal e DWORD como um inteiro de 32 bits sem sinal, juntamente com os arquivos de cabeçalho crc.h & sniptype.h .

O item só crítica no cabeçalho é essa macro (que poderia facilmente ir em si CRC_32.c:

#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))

Eu sou o autor do código fonte no link especificado. Embora a intenção da licença de código fonte não está clara (que será mais tarde hoje), o código é de fato aberto e gratuito para uso em seus aplicativos gratuitos ou comerciais, sem amarras.

O código CRC em zlib (http://zlib.net/) está entre os mais rápidos que existe, e tem uma licença de código aberto muito liberal.

E você não deve usar Adler-32, exceto para aplicações especiais onde a velocidade é mais importante do que o desempenho de detecção de erros.

usando zlib.h ( http: //refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-crc32-1.html ):

#include <zlib.h>
unsigned long  crc = crc32(0L, Z_NULL, 0);
crc = crc32(crc, (const unsigned char*)data_address, data_len);

pycrc é um script Python que gera código C CRC, com opções para selecionar o CRC tamanho, algoritmo e modelo.

É lançado sob a licença MIT. É aceitável para seus propósitos?

O mais simples e implementação direta C / C ++ que eu encontrei está em um link na parte inferior da página:

Página Web: http: // www. barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code

Code Download Link: https://barrgroup.com/code/crc.zip

É uma implementação simples autônomo com um .h e um C arquivo. Há suporte para CRC32, CRC16 e CRC_CCITT através do uso de uma definição. Além disso, o código permite que as definições de parâmetros de alteração de usuários, como o polinômio CRC, valor inicial / final, XOR, e opções de reflexão, se assim desejar.

A licença não é explicitamente definido ala LGPL ou similar. No entanto o site diz que eles estão colocando o código de domínio público para qualquer uso. Os arquivos de código reais também dizem isso.

Espero que ajude!

fork do rurbano de SMHasher (a SMHasher original parece abandonada) tem apoio CRC32 hardware. As mudanças foram adicionados antes do commit inicial, mas tente comparar os novos CMakeLists. txt e o antigo ( que não menciona SSE em tudo).

A melhor opção é provavelmente garfo zlib da Intel com suporte PCLMULQDQ descrito em este papel. Esta biblioteca também tem a SSE 4.2 otimizações .

Se você não precisa de portabilidade e você está no Linux, você pode usar a implementação do kernel (que é acelerado por hardware se disponível): https://stackoverflow.com/a/11156040/309483

me deparei com este artigo útil no cálculo de soma de verificação.

"Calculando CRC somas de verificação em C ++" no website Dr.dobbs.

http://drdobbs.com/184403658?pgno=3

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top