uint64_t bytes = ...;
fout.write((char *)&bytes, 7);
Это будет писать ровно 7 байтов, начиная с адреса & байтов. Между системами LE и BE есть различие в том, как расположены восемь байтов в памяти, хотя (предположим, переменная расположена по адресу 0xff00
):
0xff00 0xff01 0xff02 0xff03 0xff04 0xff05 0xff06 0xff07
LE: [byte 0 (LSB!)][byte 1][byte 2][byte 3][byte 4][byte 5][byte 6][byte 7 (MSB)]
BE: [byte 7 (MSB!)][byte 6][byte 5][byte 4][byte 3][byte 2][byte 1][byte 0 (LSB)]
Начальный адрес (0xff00
) не изменится, если приведен к типу char *, и вы распечатаете байт точно по этому адресу плюс следующие шесть следующих & ndash; в обоих случаях (LE и BE) адрес 0xff07
печататься не будет. Теперь, если вы посмотрите на мою таблицу памяти выше, должно быть очевидно, что в системе BE вы теряете LSB при сохранении MSB, который не несет информацию ...
В системе BE вы могли бы написать fout.write((char *)&bytes + 1, 7);
. Имейте в виду, однако, что это все еще оставляет проблему переносимости:
fout.write((char *)&bytes + isBE(), 7);
// ^ giving true/false, i. e. 1 or 0
// (such function/test existing is an assumption!)
Таким образом, данные, записанные системой BE, будут неправильно интерпретированы системой LE при обратном чтении и наоборот. Безопасной версией будет разложение каждого байта, как это сделал geza в своем ответе . Чтобы избежать нескольких системных вызовов, вы можете вместо этого разложить значения в массив и распечатать его.
Если в linux / BSD есть хорошая альтернатива , тоже:
bytes = htole64(bytes); // will likely result in a no-op on LE system...
fout.write((char *)&bytes, 7);