Ir para conteúdo
Fórum Script Brasil
  • 0

Calcular CRC32


webpantoja

Pergunta

Ae galera minha primeira dúvid ano fórum! :lol:

Estou fazendo um programa que preciso calcular o CRC32 de um arquivo binário. Bom, o cálculo para obter este CRC32 é extremamente complicado, mas já implementei. Mas estou com dúvida se realmente o resultado que estou obtendo é o resutlado válido. Gostaria que se alguém tivesse um arquivo de exemplo para me passar e o resultado experado seria de muita ajuda.

Att,

WebPantoja

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Bem... acho que não é todo mundo que está familiarizado com o CRC32... ele serve para verificar se não ouve alterações na transmissão de dados, através de cálculos polinomiais. Vou postar aí o CRC32 que eu implementei aí:

unsigned int reflect( unsigned int ref, char ch )
   {
      int i;
      unsigned int value = 0;

      //Swap bit 0 for bit 7
      //Bit 1 for bit 6, etc.
      for( i=1; 1<(ch + 1); i++ )
      {
         if( ref & 1)
         {
            value |= 1<< (ch -i);
         }
         ref >>= 1;
      }
      return value;
   }
   void initCRC32Table( void )
   {
      unsigned int ulPolynomial = 0x04c11db7;
      int i, j;

      for( i=0; i <= 0xFF; i++ )
      {
         m_crc32RefTable[i] = reflect( i, 8 ) << 24;
         for( j=0; j<8; j++ )
         {
            m_crc32RefTable[ i ] = (m_crc32RefTable[i] << 1 ) ^ (m_crc32RefTable[i] & 0x80000000 ? ulPolynomial : 0 );
         }
         m_crc32RefTable[i] = reflect( m_crc32RefTable[i], 32 );
      }
   }

   unsigned int calcCrc32( unsigned int preset, char* buf, int nbytes )
   {
      unsigned int result;
      int i;
      result = preset;
      result ^= 0xffffffff;

      for( i=0; i < nbytes; i++ )
      {
         result = (result >> 8) ^ m_crc32RefTable[(result & 0xff) ^ buf[i] ];
      }
      result ^= 0xffffffff;

      return result;
   }

   int getCRC32( const char* fileName )
   {
      long size = 0;

      int handle = open( fileName, O_RDONLY );
      if( handle > 0 )
      {
         size = handle;
         if( size <= 1 )
         {
            //Error
            return 0;
         }
         if( close(handle) != 0 )
         {
            //Error
            return 0;
         }
      }

      FILE* fp;
      int sz;
      unsigned int crc32 = 0xffffffff;

      if( (fp = fopen( fileName, "rb" ) ) == NULL )
      {
         return 0;
      }
      else
      {
         bool feof = false;
         char buffer[80];
         bool firstPacket = true;

         while( feof == false )
         {
            sz = fread( buffer, 1, sizeof(buffer), fp );
            if( firstPacket == true )
            {
               crc32 = calcCrc32( crc32, &buffer[0x20], sz-0x20 );
            }
            else
            {
               crc32 = calcCrc32( crc32, buffer, sz );
            }
            firstPacket = false;

            if( sz != sizeof(buffer) )
            {
               feof = true;
            }
         }
      }
      fclose( fp );

      return( crc32 );
   }

Então se alguém já usou o CRC32 queria que desse uma olhada para ver se está OK.

Att,

WebPantoja

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...