code natif:fwrite() dans C & readInt() en Java diffèrent dans endianess
Numéro d'écriture 27 en utilisant fwrite().
int main()
{
int a = 27;
FILE *fp;
fp = fopen("/data/tmp.log", "w");
if (!fp)
return -errno;
fwrite(&a, 4, 1, fp);
fclose();
return 0;
}
de lecture avant les données (27) à l'aide de DataInputStream.readInt():
public int readIntDataInputStream(void)
{
String filePath = "/data/tmp.log";
InputStream is = null;
DataInputStream dis = null;
int k;
is = new FileInputStream(filePath);
dis = new DataInputStream(is);
k = dis.readInt();
Log.i(TAG, "Size : " + k);
return 0;
}
O/p
Size : 452984832
Bien que dans l'hexagone est 0x1b000000
0x1b
est 27
. Mais readInt() lit les données en big endian alors que mon code natif écrit en petit boutiste. . Donc, au lieu de 0x0000001b
je reçois 0x1b000000
.
Est-ce que je comprends bien? Quelqu'un at-il déjà rencontré ce problème auparavant?
Oui, vous avez raison. C écrira en endianness de CPU, qui pour les processeurs x86 est little-endian. ['DataInputStream.readInt()'] (https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#readInt--) lira toujours big-endian. Solution: Déterminez quel endianisme votre fichier devrait avoir, et assurez-vous que les deux agissent en conséquence. – Andreas
Plus précisément, décidez que le fichier doit être big-endian, ce qui le rend portable * et * compatible avec Java, et ajuste le code C en conséquence. Tout ce dont vous avez besoin dans ce code C est 'int a = htonl (27);' – EJP
Merci @Andreas. J'ai de grandes quantités de données à écrire. Comment puis-je gérer cela efficacement en C? –