2010-03-20 14 views
6

Ich habe Rohdatenströme aus Bilddateien erhalten, wie:C++ - Bibliothek für Endian-bewusste Lesen von Raw-Datei-Stream-Metadaten?

vector<char> rawData(fileSize); 
ifstream inFile("image.jpg"); 
inFile.read(&rawData[0]); 

Ich möchte die Header der verschiedenen Bildformate für Höhe und Breite analysieren. Gibt es eine portable Bibliothek, die Ints, Longs, Shortcuts usw. aus dem Puffer/Stream lesen kann, um die Endanfälligkeit wie angegeben zu konvertieren?

Ich möchte in der Lage sein, etwas zu tun wie: short x = rawData.readLeShort(offset); oder long y = rawData.readBeLong(offset)

Ein noch bessere Option wäre eine leichte & portable Bild-Metadaten-Bibliothek (ohne das zusätzliche Gewicht einer Bibliothek zur Bildbearbeitung), die arbeiten kann, auf rohen Bilddaten. Ich habe festgestellt, dass Exif-Bibliotheken da draußen png und gif nicht unterstützen.

Antwort

0

Es ist nicht so schwer, sich selbst zu tun. Hier ist, wie Sie eine Little-Endian-32-Bit-Zahl lesen:

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[0] + 
         (buffer[1] << 8) + 
         (buffer[2] << 16) + 
         (buffer[3] << 24); 

und eine Big-Endian-32-Bit-Zahl zu lesen:

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[3] + 
         (buffer[2] << 8) + 
         (buffer[1] << 16) + 
         (buffer[0] << 24); 
+0

ich verallgemeinerte, dass dazu: 'Vorlage T Magie :: getLE (const char * Daten) const {T Wert = 0; int Bytes = Größe von (T); für (int i = 0; i Kache

+0

Tatsächlich hat der obige Code einen Fehler. Anstatt "Zeichen" einzeln zu verschieben, verschiebt es "T" nacheinander. Dies behebt folgendes: 'template T Magic :: getLE (const char * Daten) const {T Wert = 0; int Bytes = Größe von (T); unsigned char c; für (int i = 0; i Kache