Ik wil een binaire file parsen waarin een aantal strings als markers staat. Hiervoor gebruik ik de stringfuncties uit de C library. Dit omdat ik verderop grote hoeveelheden data moet verwerken.
Het gaat overigens om een avi file. Ik weet dat er voor het lezen van avi files genoeg bibliotheken zijn, maar ik heb niets kunnen vinden dat avi files met 16 bits grijswaarde video data aan kan. Ik lees de file daarom in als 8 bits unsigned chars.
Het probleem dat ik heb is dat de strstr functie 0x0 teruggeeft. Raden wat er gebeurt als je van dat adres gaat lezen
Dit is de code:
Een dump van het begin van de binaire file:
Ik krijg dus "Not found" te zien ipv "avih". Het ligt niet aan het al dan niet aanwezig zijn van een \o karakter in de string literal die ik zoek. Iemand een idee?
Het gaat overigens om een avi file. Ik weet dat er voor het lezen van avi files genoeg bibliotheken zijn, maar ik heb niets kunnen vinden dat avi files met 16 bits grijswaarde video data aan kan. Ik lees de file daarom in als 8 bits unsigned chars.
Het probleem dat ik heb is dat de strstr functie 0x0 teruggeeft. Raden wat er gebeurt als je van dat adres gaat lezen
Dit is de code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream file("/home/ik/video/1400raw.avi", ios::binary); char b[128]; file.read(b, 128); char* p = strstr(b, "avih"); if (!p) { cerr << "Not found!" << endl; return(-1); } // lees de eerste vier byes vanaf "avih' in. char s[5]; memcpy(p, s, 4); s[4] = '\0'; cout << s; return(0); } |
Een dump van het begin van de binaire file:
code:
1
2
3
4
5
6
7
8
| 00000000 52 49 46 46 10 16 f9 15 41 56 49 20 4c 49 53 54 |RIFF....AVI LIST| 00000010 c0 04 00 00 68 64 72 6c 61 76 69 68 38 00 00 00 |....hdrlavih8...| 00000020 40 0d 03 00 00 00 00 00 00 00 00 00 10 01 00 00 |@...............| 00000030 96 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................| 00000040 00 05 00 00 c0 03 00 00 00 00 00 00 00 00 00 00 |................| 00000050 00 00 00 00 00 00 00 00 4c 49 53 54 74 04 00 00 |........LISTt...| 00000060 73 74 72 6c 73 74 72 68 38 00 00 00 76 69 64 73 |strlstrh8...vids| 00000070 59 31 36 20 00 00 00 00 00 00 00 00 00 00 00 00 |Y16 ............| |
Ik krijg dus "Not found" te zien ipv "avih". Het ligt niet aan het al dan niet aanwezig zijn van een \o karakter in de string literal die ik zoek. Iemand een idee?