Divisão/MOD entre Binários

Galera to fazendo calculo de CRC antes de enviar um arquivo. Bom antes de enviar o arquivo pego o binário dele:

binario = binario.concat(Integer.toString(result, 2).trim());

Explicação: VOu concatenando e ao final tenho o binário do arquivo, beleza

Agora chamos uma função que calcula o meu Novo binário que leva com ele ao final meu checksum.

public static String calculaCrcOrigem (String binarioArquivo){
    	 String binarioOriginal = binarioArquivo.trim();
    	 //Polinomio gerador
    	 String polGerador = "101001011";
    	 binarioArquivo = binarioArquivo.concat("00000000");    	 
    	 System.out.println("Binario com zeros adicionados: " + binarioArquivo + " \n");
    	 //Converte binario original para numero binario (Prepara para divisao)
    	 BigInteger binarioArquivoInt = new BigInteger(binarioArquivo.trim(), 2);
    	 //Converte polinomio para numero binario (Prepara para divisao)
    	 BigInteger polInt = new BigInteger(polGerador.trim(), 2);
    	 //Pega o MOD entre binario e polinomio
    	 int resultado = binarioArquivoInt.mod(polInt).intValue();
    	 System.out.println("MOD de binario e polinomio: " + Integer.toString(resultado, 2) + " \n");
    	 //Concatena o no binário original (Sem os zeros) com o MOD
    	 binarioOriginal = binarioOriginal.concat( Integer.toString(resultado, 2) );
    	 System.out.println("Resultado final de binario com MOD: " + binarioOriginal + "\n");
    	 
    	 return binarioOriginal;
    	}   

Nessa função o que está acontecendo. Bom ele tem que pegar o binário, acrescentar quantidade de bits do polinomio - 1, que no meu caso o polinomio será fixo então já coloco 8 zeros.

Depois preciso dividir isso pelo polinomio gerador, fica algo tipo:

1010100100010110100111010100100010110101001000101101001110101001000101101010010001011010011101010010001011010100100010110100111010100100010110101001000101101001110101001000101101010010001011010011101010010001011010100100010110100111010100100010110101001101101010101001000101101001110101001000101101010010001011010011101010010001011010100100010100000000

MOD

101001011

Bom, pelas regras de calculo de CRC meu resultado tem que SEMPRE ser igual a base do meu CRC, que é base 8.

O meu problema é, está gerando resultados com abses diferentes, tipo 9,7, 8 as vezes, mas teria que sempre ser 8.
Já não sei o que pode ser, estou postando aqui para ver se alguém pode me dar uma dica, ja passou por isso, ou se o Java pode estar em algum lugar tratando diferente isso :slight_smile:

Agradeço as respostas
Valeu

Tio, acho que é mais fácil e mais rápido calcular CRC-32 usando as classes de java.util.zip.

Se precisar de um CRC menor (exemplo: CRC-16 ou CRC-CCITT) pode-se encontrar na Internet.

Sem contar que, no cálculo de CRC, não se usa o resto tal como você está imaginando - o cálculo de resto em CRC é feito de outra maneira, não com o método mod do BigInteger.

Olá

Antigamente a gente não tinha API que fornecesse o CRC como a do Java. E como CRC precisava ser calculado com muita rapidez em projetos de comunicação, o cálculo era feito usando as chamadas tabelas de lookup. Mesmo naquela época ninguém calculava o CRC na raça a partir do zero.

[]s
Luca

[quote=thingol]Tio, acho que é mais fácil e mais rápido calcular CRC-32 usando as classes de java.util.zip.

Se precisar de um CRC menor (exemplo: CRC-16 ou CRC-CCITT) pode-se encontrar na Internet. [/quote]

Na real preciso de crc8, meu polinomial é X8 + x6 + x3 + x + 1
que em binário fica 101001011

Poise, não sei ainda o que faço, de repente em C vai ser mais fácil …

Bom se alguém ainda tiver uma luz :slight_smile:

agradeço a todos, valeu

Nunca tinha ouvido falar de CRC-8.

Acho que dá tanta proteção contra erros em arquivos grandes quanto efetuar um checksum simples (daqueles com XOR). 8 bits são muito pouco.

Para um arquivo de 1MB já pensaria em CRC-32 logo de uma vez (que é o usado em arquivos .ZIP. ) Para arquivos maiores, usaria MD5, em vez de CRC.

De qualquer maneira, existe um tutorial na Internet que fala exatamente como é que se calcula qualquer tipo de CRC usando C - e o tutorial é muito explicativo e o código não tem mágicas com ponteiros - pode até ser portado diretamente para Java quase sem problemas. Só não lembro do nome do cara.

[quote=thingol]Nunca tinha ouvido falar de CRC-8.

De qualquer maneira, existe um tutorial na Internet que fala exatamente como é que se calcula qualquer tipo de CRC usando C - e o tutorial é muito explicativo e o código não tem mágicas com ponteiros - pode até ser portado diretamente para Java quase sem problemas. Só não lembro do nome do cara.[/quote]

Se lembrar avisa ai :slight_smile: iria me ajudar mtooo :slight_smile:

Valeuss :slight_smile:
Claro que se eu descobrir posto tb :wink:

Autor: Ross N. Williams
Título: A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
Ele ficava nesta página ( http://www.on.net/clients/rocksoft/rocksoft/ ), mas agora deve ser achado em outros lugares. O Google é seu amigo :stuck_out_tongue:

[quote=thingol]Autor: Ross N. Williams
Título: A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
Ele ficava nesta página ( http://www.on.net/clients/rocksoft/rocksoft/ ), mas agora deve ser achado em outros lugares. O Google é seu amigo :stuck_out_tongue:
[/quote]

Valeu :slight_smile: