2016-06-17 30 views
1

Kürzlich las ich (wieder) über 'endian'ness. Ich weiß, wie man den endianess des Wirtes identifiziert, da es viel Post auf SO gibt, und ich auch this gesehen habe, das ich denke, ist ziemlich gute Quelle.Endianness von binären Dateidaten erkennen

Eine Sache, die ich gerne wissen möchte, ist, wie man die Endianität der eingegebenen Binärdatei erkennt. Zum Beispiel lese ich eine Binärdatei (mit C++) wie folgt vor:

ifstream mydata("mydata.raw", ios::binary); 

short value; 
char buf[sizeof(short)]; 
int dataCount = 0; 

short myDataMat[DATA_DIMENSION][DATA_DIMENSION]; 
while (mydata.read(reinterpret_cast<char*>(&buf), sizeof(buf))) 
{ 
    memcpy(&value, buf, sizeof(value)); 
    myDataMat[dataCount/DATA_DIMENSION][dataCount%DATA_DIMENSION] = value; 
    dataCount++; 
} 

ich wissen, wie ich die Endian in der mydata.raw erkennen kann, und ob endianness wirkt dieses Programm sowieso.

Weitere Informationen:

  • Ich Manipulation nur die Daten in myDataMat mathematische Operationen verwendet wird, und keine Zeigeroperation oder bitweise Operation auf den Daten durchgeführt).
  • Meine Maschine (Host) ist Little Endian.
+1

Sie können * endianness einer Binärdatei * nicht erkennen *. Verwenden Sie einfach 'htons' usw., wenn Sie Daten in die Datei schreiben und' ntohs' etc beim Lesen –

+0

Kurz gesagt: Sie können nicht. –

+1

* Ich möchte wissen, wie ich die Endiannität erkennen kann ... * Du kannst es * nicht entdecken *. Entweder enthält die Datei selbst einen Hinweis auf die verwendete Endianz oder Sie haben wenig Glück. Wenn Sie '0x2a00' lesen, können Sie nicht feststellen, ob es' 42' (Little Endian) oder '10752' (Big Endian) ist. –

Antwort

3

Es ist unmöglich, die Endianität von Daten im Allgemeinen zu "erkennen". Genauso wie es unmöglich ist zu erkennen, ob die Daten ein Array von 4-Byte-Ganzzahlen oder doppelt so viele 2-Byte-Ganzzahlen sind. Ohne Wissen über die Repräsentation sind Rohdaten nur eine Masse bedeutungsloser Bits.

Mit etwas mehr Wissen über die Datendarstellung wird es jedoch möglich. Einige Beispiele:

  • Die meisten Dateiformate erfordern eine bestimmte Endianität. In diesem Fall ist dies nie ein Problem.
  • Unicode-Textdateien können optional mit einer byte order mark beginnen. Dieselbe Idee kann durch andere Datendarstellungen implementiert werden.
  • Einige Dateiformate enthalten checksum. Sie können eine Endianität erraten, und wenn die Prüfsumme nicht übereinstimmt, versuchen Sie es erneut mit einer anderen Endianität. Es ist unwahrscheinlich, dass die Prüfsumme mit einer falschen Interpretation der Daten übereinstimmt.
  • Manchmal können Sie anhand der Daten Vermutungen anstellen. Ist die Temperatur außerhalb 33'554'432 Grad oder vielleicht 2? Sie können das Endianity auswählen, das gesunde Daten darstellt. Natürlich versagt diese Art von Vermutung kläglich, wenn die Aliens eindringen und anfangen, unseren Planeten zu schmelzen.
3

Sie können nicht sagen.

Die Endianness-Transformation ist im Wesentlichen ein Operator E (x) auf einer Zahl x, so dass x = E (E (x)). Sie wissen also nicht, "in welche Richtung" die x Elemente in Ihrer Datei sind.