Собственный код:
запись числа 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;
}
O/p
Size : 452984832
Ну, это в шестнадцатеричном формате 0x1b000000
0x1b
это 27
. Но readInt() считывает данные с прямым порядком байтов, в то время как мой родной код пишет с обратным порядком байтов. . Итак, вместо 0x0000001b
я получаю 0x1b000000
.
Правильно ли я понимаю? Кто-нибудь сталкивался с этой проблемой раньше?
DataInputStream.readInt()
всегда будет читаться с обратным порядком байтов. Решение. Решите, какой порядок следования байтов должен иметь ваш файл, и убедитесь, что оба действуют соответствующим образом. - person Andreas   schedule 09.12.2016int a = htonl(27);
- person user207421   schedule 09.12.2016ByteBuffer
. В C вы бы построили массив байтов (char[]
) и преобразовалиint
значений вchar
, используя битовый сдвиг. - person Andreas   schedule 09.12.2016htonl()
? байт1 = i ›› 24; байт2 = i ›› 16; байт3 = я ›› 8; байт4 = я; - person Andreas   schedule 09.12.2016byte[]
и, возможно, использоватьByteBuffer
для извлечения значенийint
из таких массивов байтов, не используйтеDataInputStream
. ИспользуйтеInputStream
напрямую, а точнееBufferedInputStream
для лучшей производительности.DataOutputStream
/DataInputStream
предназначены для пересылки данных между Java-программами. Не используйте их для обмена с другими языками. - person Andreas   schedule 09.12.2016InputStream.read(byte[] b, int off, int len)
несколько раз, пока все байты не будут получены, не так сложно. Это довольно простая петля. - person Andreas   schedule 09.12.2016DataInput/OutputStream
специально разработаны для обмена данными с другими языками и платформами. Вот почему они используют сетевой порядок байтов. - person user207421   schedule 20.11.2017DataOutputStream
предназначен для записи примитивных типов данных Java переносимым способом, т. е. таким образом, чтобы данные могли читаться с помощьюDataInputStream
. Это не значит, что данные могут быть прочитаны другими языками, и они переносимы, как на любой платформе, где работает Java. Конечно, использование сетевого порядка байтов более стандартно, но это не указанная цель. - person Andreas   schedule 20.11.2017