@Nikitko_Cent

Как красиво организовать работу с little-endian файлами?

Пишу свой архиватор (точнее, переписываю с Си). Допустим, есть архив - бинарный файл со строго определённым форматом. Дабы была совместимость между little и big - endian машинами, порядок байт в файле пришлось сделать строго фиксированным (я выбрал little-endian). Тут встал вопрос в том, как на плюсах элегантно решить проблему обработки таких файлов? Конечно же, можно написать свой класс-велосипед потока на основе, скажем, FILE * . Но хочется как то использовать уже реализованные классы потоков if/ofstream - чего добру то пропадать. Была идея отнаследоваться от этих классов и перегрузить методы, непосредственно пишущие\читающие (чтоб байты грубо говоря переворачивались), но идея эта была отметена банально из-за того, что я не знаю точный список всех таких методов, да и вообще недостаточно хорошо знаю устройство работы if/ofstream, чтоб сильно в них ковыряться.
Какие есть идеи? Может быть, здесь можно как то прикрутить фасеты, но я в них не смог разобраться :( на русском информация по ним скудная
P.S. уф...что-то много букав вышло, извините :)
  • Вопрос задан
  • 226 просмотров
Пригласить эксперта
Ответы на вопрос 2
Nipheris
@Nipheris Куратор тега C++
> Но хочется как то использовать уже реализованные классы потоков if/ofstream - чего добру то пропадать.
Их и используйте, я бы на вашем месте сделал обертку вокруг другого istream-а (и ostream-а соответственно). Chaining потоков - классический способ решения такой задачи (и не только в плюсах, разумеется). Точно также, например, делают поток-расшифровщик, или поток-расжиматель, если сжатие было поточное (deflate например).
> что я не знаю точный список всех таких методов, да и вообще недостаточно хорошо знаю устройство работы if/ofstream, чтоб сильно в них ковыряться.
Какая-то странная причина. Так разберитесь). Список он вполне конкретный, для этого есть стандарт. Справка высокого качества по стд. библиотеке есть на en.cppreference.com/w
Ответ написан
S-ed
@S-ed
Комбайнёр
swap16bit = ( a>>8 ) | ( a<<8 );
swap32bit = ( a<<24 ) | ( a<<8 & 0xff0000 ) | ( a>>8 & 0xff00 ) | ( a>>24 );

В обоих случаях компилятор генерирует 1 инструкцию, rol и bswap соотв.
Или подключить byteswap.h (в котором прописано всё то-же самое)

По теме:
stackoverflow.com/questions/7342527/byte-swap-duri...
stackoverflow.com/questions/2182002/convert-big-en...
dox.ipxe.org/include_2byteswap_8h.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы