Ik ben al een tijdje aan het proberen om een CRC van een MP3 frame te krijgen. Het wil echter maar niet werken! Ik heb een MP3tje gemaakt d.m.v. Lame, met CRC info en mijn programma geeft steeds een andere CRC dan diegene die in de frame-header staat. Ik heb het programma al stap voor stap doorgelopen met de debugger, maar ik kom er nog steeds niet uit. Weet iemand wat er aan de hand is?
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| int
checkcrc16(file, fi)
file_info * file;
frame_info * fi;
{
char * pnt;
int res;
int len;
int new_crc16;
/* get some memory to put the data in to be crcked */
pnt=(char *)malloc(fi->length);
if (pnt==NULL) {
fileerror(file, " malloc failed");
return FALSE;
}
memset(pnt, 0, fi->length);
/* read byte 2 and 3 from the header */
cfseek(file->fp, (fi->offset)+2, SEEK_SET);
res=cfread(pnt, 2, file->fp);
if (!res) {
free(pnt);
return FALSE;
}
/* read the rest of the frame */
cfseek(file->fp, (fi->offset)+6, SEEK_SET);
len=(fi->length)-6; // minus header and crc
res=cfread(pnt+2, len, file->fp);
if (res<len) {
free(pnt);
return FALSE;
}
new_crc16=crc16(pnt, len+2);
free(pnt);
if (new_crc16==fi->crc16) {
return TRUE;
} else {
return TRUE;
}
} |
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #define CRC16_POLYNOMIAL 0x8005
/* from lame 3.93.1 */
int
crc_update(int value, int crc)
{
int i;
value <<= 8;
for (i = 0; i < 8; i++) {
value <<= 1;
crc <<= 1;
if (((crc ^ value) & 0x10000))
crc ^= CRC16_POLYNOMIAL;
}
return crc;
}
int
crc16(data, length)
unsigned char * data;
int length;
{
int i;
int crc=0xffff;
for (i=0; i<length; i++)
crc=crc_update(data[i], crc);
return crc&0xffff;
} |