dtv_channel.txt crc32
4 participantes
Página 1 de 1.
dtv_channel.txt crc32
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:
Y al ejecutarlo en ubuntu la salida resultante es:
Código:
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:
Y la estructura de datos que se emplea es similar a esta:
Código:
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
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
Re: dtv_channel.txt crc32
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!!!!!!! pasando de little a big endian, u ordenando los bytes.
Espero te ayude saludos!!!!
Aqui el codigo fuente, binario y ejemplos:
dtv_channel_crc_calculator
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!!!!!!! pasando de little a big endian, u ordenando los bytes.
Espero te ayude saludos!!!!
Aqui el codigo fuente, binario y ejemplos:
dtv_channel_crc_calculator
vic1972- Mensajes : 2260
Fecha de inscripción : 09/12/2009
Edad : 51
Localización : Malaga
Re: dtv_channel.txt crc32
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.
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
Re: dtv_channel.txt crc32
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]
[Tienes que estar registrado y conectado para ver este vínculo]
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|