Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

Почему бинарные файлы созданные разными языками программирования различаются?

#java #cpp


Например, мои коды на языках программирования Java и C++ дают разные бинарные файлы.

Код на C++:

char fileName[100];
cin >> fileName;
int N;
cin >> N;
ofstream file(fileName, ios::binary);
for (int i = 2, j = 1; j <= N; i += 2, j++)
    file.write( reinterpret_cast(&i), sizeof(i) );
file.close();


Код на Java:

RandomAccessFile ra = new RandomAccessFile(scanner.nextLine(), "rw");
int limit = scanner.nextInt();
int number = 2;
for (int i = 0; i < limit; i++) {
    ra.writeInt(number);
    number += 2;
}
ra.close();


Задача:
Дано имя файла и целое число N (> 1). Создать файл целых чисел с данным именем и
записать в него N первых положительных четных чисел (2, 4, …).

Может они используют разные алгоритмы?



Бинарный файл, я имею ввиду не исполняемый файл, а файл данных. То есть, двоичные файлы
    


Ответы

Ответ 1



Начнем с Java - описание метода: The java.io.RandomAccessFile.writeInt(int v) method writes an int to the file as four bytes, high byte first. То есть всегда пишет в файл 4 байта старшим байтом вперед - такое представление называют BigEndian. Java - платформонезависимый язык, поэтому на любой платформе Вы получите одинаковый результат. А вот с C++ все гораздо интереснее - reinterpret_cast(&i) - преобразует int в массив из 4х байт в последовательности, которая зависит от платформы BigEndian или LittleEndian. Поэтому даже один и тот же код на разных платформах будет выдавать разный результат. (архитектура x86 имеет порядок LittleEndian)

Комментариев нет:

Отправить комментарий