1
votes

L'endianité affecte-t-elle l'écriture d'un nombre impair d'octets?

Imaginez que vous ayez un uint64_t octets et que vous savez que vous n'avez besoin que de 7 octets car les entiers que vous stockez ne dépasseront pas la limite de 7 octets.

Lors de l'écriture d'un fichier, vous pouvez faire quelque chose comme

std :: ofstream fout (fileName); fout.write ((char *) & octets, 7);

pour n'écrire que 7 octets.

La question que j'essaie de comprendre est de savoir si l'endianess d'un système affecte les octets qui sont écrits dans le fichier. Je sais que endianess affecte l'ordre dans lequel les octets sont écrits, mais cela affecte-t-il également quels octets sont écrits? (Seulement pour le cas où vous écrivez moins d'octets que l'entier n'en a habituellement.)

Par exemple, sur un petit système endian, les 7 premiers octets sont écrits dans le fichier, en commençant par le LSB. Sur un système big endian, qu'est-ce qui est écrit dans le fichier?

Ou pour le dire autrement, sur un petit système endian, le MSB (le 8e octet) n'est pas écrit dans le fichier. Peut-on s'attendre au même comportement sur un système big endian?


1 commentaires

Le 8ème octet ne sera pas écrit dans le fichier. Sur un système little endian, ce 8ème octet (non écrit) sera l'octet le plus significatif, mais sur un système big endian, ce sera le moins significatif.


3 Réponses :


2
votes

La finalité affecte uniquement la manière dont (16, 32, 64) int sont écrits. Si vous écrivez des octets , (comme c'est votre cas) ils seront écrits exactement dans le même ordre que vous le faites.

Par exemple, ce type d'écriture sera affecté par l'endianess:

std::ofstream fout(fileName);
int i = 67;
fout.write((char *)&i, sizeof(int));


1 commentaires

Pouvez-vous expliquer pourquoi vous avez converti un int * en int * ?



1
votes
bytes = htole64(bytes); // will likely result in a no-op on LE system...
fout.write((char *)&bytes, 7);

0 commentaires

1
votes

La question que j'essaie de comprendre est de savoir si l'endianess d'un système affecte les octets qui sont écrits dans le fichier.

Oui, cela affecte les octets sont écrits dans le fichier.

Par exemple, sur un petit système endian, les 7 premiers octets sont écrits dans le fichier, en commençant par le LSB. Sur un système big endian, qu'est-ce qui est écrit dans le fichier?

Les 7 premiers octets sont écrits dans le fichier. Mais cette fois, à commencer par le MSB. Donc, à la fin, l'octet le plus bas n'est pas écrit dans le fichier, car sur les systèmes big endian, le dernier octet est l'octet le plus bas.

Donc, ce n'est pas ça que vous vouliez, parce que vous perdez des informations.

Une solution simple consiste à convertir uint64_t en little endian et à écrire la valeur convertie. Ou écrivez simplement la valeur octet par octet d'une manière qu'un petit système endian l'écrirait:

uint64_t x = ...;

write_byte(uint8_t(x));
write_byte(uint8_t(x>>8));
write_byte(uint8_t(x>>16));
// you get the idea how to write the remaining bytes

0 commentaires