Je voulais suivre les directives de Rob Pikes et stocker des entiers sur le disque sans se soucier de l'endianess. Donc, voici mon code de test:sérialiser ints à big endian pour le stockage
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
typedef uint8_t byte;
uint32_t _wireto32(byte *data) {
uint32_t i =
((uint32_t)data[3]<<0) |
((uint32_t)data[2]<<8) |
((uint32_t)data[1]<<16) |
((uint32_t)data[0]<<24);
return i;
}
void _32towire(uint32_t i, byte *data) {
data[0] = (i >> 24) & 0xFF;
data[1] = (i >> 16) & 0xFF;
data[2] = (i >> 8) & 0xFF;
data[3] = i & 0xFF;
}
void _dump(char *n, byte *d, size_t s, uint64_t N) {
int l = strlen(n) + 9;
fprintf(stderr, "%s (len: %ld, Num: %ld): ", n, s, N);
size_t i;
int c;
for (i=0; i<s; ++i) {
fprintf(stderr, "%02x", d[i]);
if(i % 36 == 35 && i > 0) {
fprintf(stderr, "\n");
for(c=0; c<l; ++c)
fprintf(stderr, " ");
}
}
fprintf(stderr, "\n");
}
int main(int argc, char **argv) {
FILE *fd = NULL;
uint32_t n_orig = 20160809;
uint8_t b[4];
uint32_t n_new;
if(argc != 2) {
fprintf(stderr, "Usage: util w|r\n");
exit(1);
}
switch(argv[1][0]) {
case 'w':
if((fd = fopen("buffer.b", "wb+")) == NULL) {
perror("unable to write buffer.b");
return 1;
}
_32towire(n_orig, b);
fwrite(b, 4, 1, fd);
close(fd);
_dump("out", b, 4, n_orig);
break;
case 'r':
if((fd = fopen("buffer.b", "rb+")) == NULL) {
perror("unable to open read buffer.b");
return 1;
}
if((fread(b, 1, 4, fd)) <=0) {
perror("unable to read from buffer.b");
return 1;
}
close(fd);
n_new = _wireto32(b);
_dump(" in", b, 4, n_new);
}
return 0;
}
Quand je lance ce sur un système x86, tout semble bien:
% ./util w && ./util r
out (len: 4, Num: 20160809): 0133a129
in (len: 4, Num: 20160809): 0133a129
Maintenant, si je transfère le fichier de sortie à un système big-endian (aix sur powerpc dans mon cas), je reçois:
./util r
in (len: 4, Num: 0): 0133a129
Donc, je suis évidemment sur quelque chose. est-ce que quelqu'un a une idée?
Merci, Tom
"Je suis évidemment négliger quelque chose" - pourquoi ?? a l'air ok pour moi. –
Qu'est-ce qui ne va pas? Veuillez éditer votre question et indiquer clairement quelle sortie vous attendez. Tout me semble bien ici. –
Que dit le débogueur? – Olaf