De vraag is niet specifiek op een taal gericht, daarom heb ik er ook geen [brackets] bij geplaatst.
Ik ben bezig met het schrijven van een decoder voor FLAC bestanden, en bots op het volgende probleem.
Volgens de specificatie van de frame header, moet je op het einde het frame- en samplenummer kunnen achterhalen (zie: "UTF-8" coded frame number (decoded number is 31 bits)). Wat ik daarvan begrijp, is dat bij een fixed blocksize het framenummer tussen de 8 en 48 bits ruimte in beslag neemt. En dat dit de UTF-8 representatie is van een nummer. Dus met een range tussen 0x30 en 0x39.
Echter, daar aangekomen in het bestand, zie ik voor het eerste frame waarde 0x00 staan. Alle informatie die ik daarvoor heb opgehaald is correct (blocksize, sample size, channel assignment, ...), dus ik ben vrijwel zeker dat ik naar de juiste byte ben aan het kijken.
Als ik er een andere decoder bijhaal, zie ik bijvoorbeeld dit:
Als ik in deze functie echter manueel 0x31 invoer (ik verwacht dus "1" als uitvoer), krijg ik een compleet ander resultaat. Waar is mijn denkwijze ergens compleet de mist ingegaan? Of wat voor data moet ik wel verwachten?
Ik ben bezig met het schrijven van een decoder voor FLAC bestanden, en bots op het volgende probleem.
Volgens de specificatie van de frame header, moet je op het einde het frame- en samplenummer kunnen achterhalen (zie: "UTF-8" coded frame number (decoded number is 31 bits)). Wat ik daarvan begrijp, is dat bij een fixed blocksize het framenummer tussen de 8 en 48 bits ruimte in beslag neemt. En dat dit de UTF-8 representatie is van een nummer. Dus met een range tussen 0x30 en 0x39.
Echter, daar aangekomen in het bestand, zie ik voor het eerste frame waarde 0x00 staan. Alle informatie die ik daarvoor heb opgehaald is correct (blocksize, sample size, channel assignment, ...), dus ik ben vrijwel zeker dat ik naar de juiste byte ben aan het kijken.
Als ik er een andere decoder bijhaal, zie ik bijvoorbeeld dit:
Java:
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
48
49
50
51
| private long readUtf8Int(BitInputStream source) throws IOException { long v=0; int x=0, i=0; x=source.getInt(8); if((x&0x80)==0) { v=x; i=0; } else if((x&0xe0)==0xc0) { /* 110xxxxx */ v = x & 0x1f; i = 1; } else if((x&0xf0)==0xe0) { /* 1110xxxx */ v = x & 0x0F; i = 2; } else if((x&0xf8)==0xf0) { /* 11110xxx */ v = x & 0x07; i = 3; } else if((x&0xfc)==0xf8) { /* 111110xx */ v = x & 0x03; i = 4; } else if((x&0xfe)==0xfc) { /* 1111110x */ v = x & 0x01; i = 5; } else if(x==0xfe) { /* 11111110 */ v = 0; i = 6; } else { return Long.MIN_VALUE; } for( ; i>0; i--) { x=source.getInt(8); if((x&0xc0)!=0x80) { /* 10xxxxxx */ return Long.MIN_VALUE; } v <<= 6; v |= (x & 0x3f); } return v; } |
Als ik in deze functie echter manueel 0x31 invoer (ik verwacht dus "1" als uitvoer), krijg ik een compleet ander resultaat. Waar is mijn denkwijze ergens compleet de mist ingegaan? Of wat voor data moet ik wel verwachten?