dtv_channel.txt crc32

Ir abajo

dtv_channel.txt crc32

Mensaje  Admin el Lun Feb 13, 2012 7:55 pm

El usuario pepepotamo me ha hecho llegar una consulta muy interesante sobre programación vía email,
la pongo aquí por interés general. Saludos.

Hola vic1972,

Desde hace bastante tiempo que sigo el foro y en su día leí todo lo publicado sobre el tratamiento del fichero dtv_channel.txt.


El caso es que he probado el programa dtv_channel_crc32 que publicaste para generar el CRC32 de mi fichero dtv_channel.txt
pero no coincide exactamente con lo que aparece en el fichero.

Sin embargo si pruebo con el DTV Channel Manager el cálculo lo genera correctamente.

El código que estoy utilizando es el siguiente:

Código:
Código:

    #include <stdio.h>


    unsigned int polynom = 0x04C11DB7;


    unsigned int GetCRC32(unsigned char data, unsigned int crc32) {
    int i=7;
      for (i = 7; i >=0; i--) {
            if (((data & (1 << i)) > 0) == ((crc32 & 0x80000000) > 0))
                crc32 <<= 1;
            else {
                crc32 = (crc32 << 1) ^ polynom;
            }
        }
    return (crc32);
    }

    int main(int argc, char *argv[])
    {
    unsigned int startcode = 0xffffffff;
   
    unsigned int crc32=startcode;

      printf("CRC-32 especial para dtv_channel.txt.\n");


      //printf(" argc: %d\n",argc);
      if (argc<2) {
        printf(" Se necesita un parametro de entrada: nombre de archivo.\n");
        return 0;
      }

      printf("Filename: %s\n", argv[1]);


      FILE *fd;
      fd = fopen(argv[1], "r");

      if (fd==NULL)
      {
        printf("No se encuentra el fichero indicado: %s \n",argv[1]);
        return 0;
      }

      int  c;
    unsigned char b;
   
      c = fgetc (fd);

      while (c != EOF ) {
        b=c;
        crc32 = GetCRC32(b, crc32);
        c = fgetc (fd);
    }


    printf("resultado: %x\n",crc32);


      fclose(fd);
      return 1;
    }


Y al ejecutarlo en ubuntu la salida resultante es:

Código:
Código:

    CRC-32 especial para dtv_channel.txt.
    Filename: dtv_channel.txt
    resultado: caa004c7



Mientras que los últimos 4 bytes del fichero son: 63 4F AF 20

No sé como te puedo adjuntar el fichero de pruebas para que veas lo que te indico.

Por lo que he podido ver en internet el formato del fichero se ajusta a lo siguiente:



El formato de este fichero es:
Código:

    * Una cabecera de 4 bytes: 66 00 00 FF
    * Un entero de 4 bytes con el número de canales almacenados

    Y a partir de aquí hay bloques de 864 bytes para cada canal encontrado, es curioso este valor porque en otros equipos el número de bytes/canal es menor, por ejemplo en el LG este valor es de 576 bytes. Vamos a ver que contiene uno de estos bloques

    * Un entero de 2 bytes con el número de canal (el que se usa con el mando a distancia)
    * Un entero de 2 bytes con el número lógico de canal (el que obtiene el cuando busca)
    * Un entero de 4 bytes con la longitud +1 del nombre de la cadena
    * Una cadena de 32 bytes con el nombre de la emisora relleno de ceros
    * Un valor de 4 bytes desconocido
    * Un valor de 4 bytes desconocido
    * Un entero de 4 bytes con la frecuencia del canal en Hz
    * Un valor de 4 bytes desconocido
    * Un entero de 4 bytes con el ancho de banda del canal? = 8
    * Un valor de 12 bytes desconocido
    * Un entero de 4 bytes con un valor de 1 para cadenas de TV y de 2 para Radio
    * Un entero de 4 bytes con un valor de 10 para cadenas de TV y de 20 para Radio
    * Un entero de 4 bytes con la longitud del nombre de la cadena
    * Una cadena de 32 bytes con el nombre de la emisora relleno de ceros
    * 748 bytes con casi todo ceros que desconozco



Y la estructura de datos que se emplea es similar a esta:

Código:
Código:

    // Fichero de datos
    u32 Signature;                  // 0xFF000006
    u32 numChannels;                // Nº de canales
    info_ch ch[numChannels];        // Información de canales
    u32 crc32;                      // CRC32 de datos

    // Datos canal
    typedef struct {
        u16 IdPartner;              // Identificador de canal
        u16 numCanalTDT;            // Nº de canal TDT (orden de sintonización, separado TV/RADIO)
        u32 bytesNombre;            // Tamaño nombre canal (incluye 0 final)
        u8 nombre[32];              // Nombre canal (UTF-8)
        u32 campo3;                // Desconocido
        u32 campo4;                // Desconocido
        u32 freq;                  // Frecuencia del canal (Hz)
        u32 campo5;                // Desconocido
        u32 ancho_banda;            // Ancho de banda del canal (8MHz)
        u16 network_id;            // Original Network ID
        u16 transport_stream_id;    // Transport Stream ID
        u16 service_id;            // Service ID (SID)
        u16 campo7;                // Desconocido
        u32 campo8;                // Desconocido
        u32 isTV;                  // SDTV = 1, RADIO = 2, HDTV = 25
        u16 flags;                  // Activo = 0, Borrado = 1, Favorito = 4
        u8 tipoCanal;              // TV = 16, RADIO = 32
        u8 tipoCodec;              // Libre = 0, Codificado = 16
        u32 bytesNombreTDT;        // Tamaño nombre canal TDT (sin 0 final)
        u8 nombreTDT[32];          // Nombre canal TDT (según ETSI EN 300 468 -> ISO-6937 / ISO-8859-9)
        u8 campo9[748];            // Desconocido
    } info_ch;



Si me puedes dar alguna pista de por qué en este caso no funciona correctamente el cálculo del CRC32?

Un saludo y gracias.
pepepotamo

Admin
Admin

Mensajes : 70
Fecha de inscripción : 07/12/2009

Ver perfil de usuario http://ms450.forosactivos.net

Volver arriba Ir abajo

Re: dtv_channel.txt crc32

Mensaje  vic1972 el Lun Feb 13, 2012 9:36 pm

Hola pepepotamo,
gracias por preguntar en el foro.

Hace ya algo de tiempo que estuve viendo esta programación, hoy la he compilado, y coincide el calculo del crc-32 con el del archivo.

En este fichero, puedes ver tanto el código fuente, como mi archivo de canales en binario , como en ascii,

si te fijas al final del archivo el crc es:

00 00 00 00 00 00 00 00 00 00 00 00 00 03 65 A3 B5[victor@dark dtv_channel]$

Y si ejecutamos la aplicacion:

[victor@dark dtv_channel]$ ./a.out

New CRC-32 value: b5a36503
COINCIDE!!!!!!! Smile pasando de little a big endian, u ordenando los bytes.

Espero te ayude saludos!!!!

Aqui el codigo fuente, binario y ejemplos:
[Tienes que estar registrado y conectado para ver este vínculo]
avatar
vic1972

Mensajes : 2260
Fecha de inscripción : 09/12/2009
Edad : 46
Localización : Malaga

Ver perfil de usuario

Volver arriba Ir abajo

Re: dtv_channel.txt crc32

Mensaje  pepepotamo el Mar Feb 14, 2012 12:06 am

Muchísimas gracias.

Funciona perfectamente y ya me he dado cuenta donde estaba cometiendo el error, principalmente al considerar el fichero completo a la hora de hacer el nuevo cálculo del CRC32 sin eliminar los últimos 4 bytes del fichero.

De nuevo gracias por proporcionarme la solución.

pepepotamo

Mensajes : 1
Fecha de inscripción : 31/08/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: dtv_channel.txt crc32

Mensaje  Keltek el Mar Feb 14, 2012 3:25 pm

I take a quick look at this problem (seem to be fixed now). You can see all the channel work in my tiny utility used in MSHP - LGChanEdit
[Tienes que estar registrado y conectado para ver este vínculo]
avatar
Keltek

Mensajes : 291
Fecha de inscripción : 10/03/2010
Edad : 41
Localización : Praha - Czech Republic

Ver perfil de usuario http://www.fozona.cz/

Volver arriba Ir abajo

Re: dtv_channel.txt crc32

Mensaje  Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.