@beem7

Почему при сериализации uint128 сначала сериализуют hi, потом lo, а не наоборот?

В одном проекте есть библиотека, используемая также в ряде других проектов подобного толка. В ней есть тип uint128, реализованный вот так:
struct uint128 {
    uint64 hi;
    uint64 lo;
    // и дальше всякие методы и т.д.
};

В этой же библиотеке поддерживается и бинарная сериализация типов. В том числе и этого. При сериализации в бинарном потоке сначала пишется поле hi, потом поле lo, а не наоборот. Покажу, как это выглядит, на примере.
Допустим, переменная:
uint128 x = 1234;
Здеcь hi = 0, lo = 1234 = 4D2.
Сериализация только x.lo выглядела бы так:
D2 40 00 00 00 00 00 00
Как видим, при сериализации байты просто пишутся в обратном порядке.
Если бы x.lo был, к примеру, uint32, то было бы так:
D2 40 00 00
Отсюда логично ожидать, что сериализация x целиком (будь он стандартным типом, а не структурой) будет выглядеть так:
D2 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Но в структуре-то сделали первым hi. Поэтому имеем:
00 00 00 00 00 00 00 00 D2 40 00 00 00 00 00 00
где первые 8 байт - это тот самый hi, а вторые - это lo.

ИМХО, такие моменты очень сильно затрудняют проектирование чего-либо. Если в библиотеке есть тип, который внешне называется и выглядит как "дополняющий стандартные типы", то и поведения от него ожидаешь как от стандартного. А он ведет себя не так. При отсутствии тестирования можно и баг словить.

У меня большое желание добавить туда свой тип, взяв за основу код uint128 и изменив лишь порядок полей в структуре. Более того, я бы даже не стал делать свой тип, а просто поменял порядок полей в этом типе. Делать так не буду лишь потому, что у проекта много форков, там тоже широко задействована библиотека, а какой-то код можно притащить оттуда и это чревато проблемами, если вот так переделать в библиотеке.

Насколько я неправ, считая, что описанное - просто недодумка авторов столь широко используемой библиотеки?
Я описал, чем хорошо мое расположение полей, а чем и в каком случае оно может быть плохо?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
@TheCalligrapher
Это сделано потому, что данная библиотека написана в соответствии с некоей внешней спецификацией, которую вы в своем вопросе упомянуть забыли. В этой внешней спецификации черным по белому сказано, что надо делать именно так - потому и сделано именно так. Вот и весь ответ. А уж почему в этой внешней спецификации наличествует такое странное требование - вопрос к ее авторам. Может у них были на то веские причины, а может просто глупость сморозили.

В общей постановке вопрос "почему сначала сериализуют hi, потом lo" бессмыслен. Нет, в общем случае так НЕ делают.

Также не понятно ваше утверждение "при сериализации байты просто пишутся в обратном порядке". Порядок от "младшим к старшим" - это естественный прямой порядок. Ничего "обратного" в нем нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Почему сериализуют так а не наоборот? Просто так принято при передаче по сети. Сериализация может использоваться и для этого, поэтому автор, наверно, сделал так.

На самом деле - можно делать как автору библиотеки захочется. Хоть сначала все четные биты записать, потом - нечетные, хоть hi/low, хоть Low/hi, если какая-то совместимость с другими библиотеками не требуется.
Ответ написан
maaGames
@maaGames
Погроммирую программы
Потмоу что в структуре сперва написано hi, а потом lo. Поэтому сперва сохранены байты верхней половины, а потом нижней. Почему low и hi расположены так - вопрос к программистам, которые структуры создали.
Соглашусь, что это выглядит как косяк, потому что нельзя будет взять нативное 128 битное целое и загрузить из ранее сохранённого файла, т.к. порядок байт будет неправильный. Разработчики не подумали, что 128 битные целые могут быть добавлены "скоро".
Если бы структура сохранялась через указатель на структуру и sizeof(uint128), то порядок байт был бы правильный и совместимый с потенциально добавленными 128 битными целыми. Так что, в первую очередь, это косяк (библиотеки) сериализатора этой структуры.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы