Целью вывода этих шестнадцатеричных цифр является создание заголовка для файла .bmp.
У вас, кажется, есть большое неправильное представление о том, как работают файлы.
Операторы потока <<
генерируют текст (удобочитаемый вывод). Формат файла .bmp - это двоичный формат, который не читается человеком (будет, но не очень хорошо, и я бы не стал читать его без инструментов).
Что вы действительно хотите сделать, это сгенерировать двоичный вывод и поместить его в файл:
char x = 0x43;
output.write(&x, sizeof(x));
Это записывает один байт данных с шестнадцатеричным значением 0x43 в выходной поток. Это двоичное представление, которое вы хотите.
будет ли я храниться в младшем или старом порядке? Изменится ли конечность в зависимости от того, на каком компьютере запущена или скомпилирована программа?
Ни; Вы снова выводите текст (не двоичные данные).
int i = 0;
output.write(reinterpret_cast<char*>(&i), sizeof(i)); // Writes the binary representation of i
Здесь вам нужно беспокоиться о порядке (и размере) целочисленного значения, и это будет зависеть от оборудования, на котором вы запускаете приложение. Для значения 0 не нужно беспокоиться о порядке байтов, но вы должны беспокоиться о размере целого числа.
Я бы добавил некоторые утверждения в мой код, чтобы проверить правильность архитектуры для кода. Тогда пусть люди беспокоятся о том, что их архитектура не соответствует требованиям:
int test = 0x12345678;
assert((sizeof(test) * CHAR_BITS == 32) && "BMP uses 32 byte ints");
assert((((char*)&test)[0] == 0x78) && "BMP uses little endian");
Существует семейство функций, которые помогут вам с порядком байтов и размером.
http://www.gnu.org/s/hello/manual/libc/Byte-Order.html
Функция: uint32_t htonl (uint32_t hostlong)
Эта функция преобразует целое число uint32_t hostlong из порядка байтов хоста в порядок байтов сети.
// Writing to a file
uint32_t hostValue = 0x12345678;
uint32_t network = htonl(hostValue);
output.write(&network, sizeof(network));
// Reading from a file
uint32_t network;
output.read(&network, sizeof(network);
uint32_t hostValue = ntohl(network); // convert back to platform specific value.
// Unfortunately the BMP was written with intel in-mind
// and thus all integers are in liitle-endian.
// network bye order (as used by htonl() and family) is big endian.
// So this may not be much us to you.
Последнее. Когда вы открываете файл в двоичном формате output.open("BWhite.bmp",ios::binary)
, он ничего не делает для потоковой передачи, кроме того, как он обрабатывает end of line sequence
. Когда файл находится в двоичном формате, вывод не изменяется (то, что вы помещаете в поток, это то, что записывается в файл). Если вы оставите поток в текстовом режиме, то символы '\ n' преобразуются в конец строки (специфический для ОС набор символов, определяющий конец строки). Поскольку вы пишете двоичный файл, вы определенно не хотите никакого вмешательства в символы, которые вы пишете, поэтому двоичный файл является правильным форматом. Но это не влияет на другие операции, выполняемые в потоке.