/ / Schreiben eines Bytes mit dem Systemaufruf "write" in C - c, Systemaufrufen

Schreiben eines Bytes mit dem Systemaufruf "schreiben" in C - c, Systemaufrufe

Ich versuche, mit dem Systemaufruf schreiben eine Nummer in eine Datei zu schreiben. Ich möchte, dass die Datei, auf die fileid verweist, 4 als "04" (erwartetes Ergebnis) hat.

    unsigned int g =  4;

if (write(fileid, &g, (size_t) sizeof(int) ) == -1)
{
perror("Error"); exit(1);
}

Ich bekomme die Ausgabe "0000 0004" in meiner Datei. Wenn ich statt sizeof (int) eine setze, bekomme ich 00.

Gibt es einen bestimmten Typ, den ich vermisst habe?

PS. Ich muss diesen Wert auch aus der Datei lesen. Wenn es also keinen Typ gibt, weiß ich nicht genau, wie ich das machen würde.

Antworten:

2 für die Antwort № 1

sizeof (int) gibt 4 zurück; Der Code schreibt also tatsächlich vier Bytes.

Ändern Sie den Typ von "g" von

unsigned int

zu

unsigned char

... und ändern

sizeof(int)

zu

sizeof(unsigned char) .. or sizeof(g)

Dann sollten Sie sehen, dass nur ein Byte "04" geschrieben wird.


3 für die Antwort № 2

Wenn Sie 1 Byte schreiben g 00 oder 04 drucken, hängt von der Architektur ab. Normalerweise werden 32-Bit-Ganzzahlen mit Little Endian im Speicher abgelegt, dh das niederwertigste Byte steht an erster Stelle, also 32-Bit int 4 wird als 04 00 00 00 gespeichert und das erste Byte ist 04.

Dies ist jedoch nicht immer richtig. Einige Architekturen werden unter Verwendung von Big-Endian gespeichert. Die Bytereihenfolge im Speicher entspricht also der im 32-Bit-Hexadezimalwert 00 00 00 04 gelesenen.

Wikipedia-Artikel.


0 für die Antwort № 3

In diesem Fall würde ich die Verwendung empfehlen uint8_t, die in definiert ist <stdint.h>. Auf praktisch allen Systemen, denen Sie jemals begegnen werden, ist dies ein typedef für unsigned charWenn Sie diesen Namen verwenden, wird jedoch klarer, dass der Wert in der Variablen als Zahl und nicht als Zeichen behandelt wird.

uint8_t g = 4;
if (write(fileid, &g, 1) != 1) {
perror("write");
exit(1);
}

(sizeof(char) == 1 per Definitionund deshalb ist es so sizeof(uint8_t).)

Um zu verstehen, warum sich Ihr ursprünglicher Code nicht wie erwartet verhielt, lesen Sie weiter Endianheit.


0 für die Antwort № 4

Wenn Sie nur ein Byte speichern möchten, ist es sinnvoller, eine Variable mit der Größe 1 Byte zu erstellen und diese mit zu speichern write.

unsigned int g =  4;
unsinged char c = (unsigned char)g;

if (write(fileid, &c, 1 ) == -1)
{
perror("Error"); exit(1);
}

Wenn Sie Daten verlieren, befinden sich diese im Programm und nicht in Dateien.