порядок байтов Native код:FWRITE() в C & readInt() в Java отличаются
написание номер 27, используя 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;
}
Чтение обратно данные (27) с использованием 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;
}
О/р
Size : 452984832
Хорошо, что в шестнадцатеричном является 0x1b000000
0x1b
27
. Но readInt() читает данные как большие endian, в то время как моя родная кодировка написана как маленькая endian. , Итак, вместо 0x0000001b
я получаю 0x1b000000
.
Правильно ли я понимаю? Кто-нибудь сталкивался с этой проблемой раньше?
Да, вы правы. C будет писать в endianness CPU, что для x86-процессоров малопригодно. ['DataInputStream.readInt()'] (https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#readInt--) всегда будет читать big-endian. Решение. Определите, какая информация должна иметь ваш файл, и убедитесь, что оба действуют соответственно. – Andreas
Понятно, что файл должен быть большим, что делает его переносимым * и * совместимым с Java и соответствующим образом скорректирует код C. Все, что вам нужно в этом C-коде, это 'int a = htonl (27);' – EJP
Спасибо @Andreas. У меня есть большое количество данных для записи. Как я могу справиться с этим эффективно в C? –