2016-10-17 5 views
1

Ich habe ein Programm in C, das eine Häufigkeitstabelle in eine Binärdatei schreibt. Die Häufigkeitstabelle ist ein Array, das mit Strukturen gefüllt ist, die ein int und ein char enthalten.C - Ganzzahl in Binärdatei schreiben mit nur 3 Bytes

Also muss ich einen unsigned int-Zähler und ein Zeichen Zeichen ohne Vorzeichen (mehrere Male) in die Datei schreiben.

Ich weiß, dass eine ganze Zahl normalerweise 4 Bytes verwendet, aber ich weiß, dass der int-Zähler nie größer als 2^24-1 sein kann.

So könnte ich 4 Bytes verwenden, um den Zähler und das Zeichen in die Datei => 3 Bytes für Zähler und 1 Byte für das Zeichen zu schreiben. Dies wäre auch leicht zu lesen.

Gibt es eine einfache Möglichkeit, dies in C zu tun, ohne spezielle Bibliotheken zu verwenden?

+0

Dieses leicht eine 'char getan werden kann [4]' und 'fread' /' fwrite'. Wenn das nicht genug von einem Hinweis ist, seien Sie bitte genauer, was Sie nicht tun können. – zwol

Antwort

4

Ja, es gibt eine sehr einfache Möglichkeit, dies in C zu tun. Sie können eine char, die ein Byte auf allen Plattformen ist, mit einem int von bis zu 24 Bit durch Verschieben der char um 24 Bit kombinieren die links:

uint32_t toWrite = (myChar << 24) | myCount; 

Wenn Sie die Daten wieder lesen, führen Sie die entgegengesetzte Operation:

uint32_t fromFile; 
uint32_t myCount = fromFile & 0xFFFFFF; 
char myChar = (fromFile >> 24) & 0xFF; 
+0

Jetzt haben Sie ein Endianness-Problem. Das Verschieben in das Vorzeichenbit ist ebenfalls UB. – zwol

+0

@zwol Ganzzahlen haben keine Endianess. –

+0

@WeatherVane Die Bytes, die in eine Datei geschrieben werden, wenn Sie 'fwrite (& toWrite, sizeof (int), 1, fp)' schreiben, haben eine Endianness, und Sie wissen nicht welche. – zwol

Verwandte Themen