У меня есть переменная типа uint8_t
, которую я хотел бы сериализовать и записать в файл (который должен быть довольно портативным, по крайней мере для Windows, на что я нацелен) ,Преобразование uint8_t в его двоичное представление
Попытка записать его в файл в своей бинарной форме, я наткнулся на эту рабочий сниппета:
uint8_t m_num = 3;
unsigned int s = (unsigned int)(m_num & 0xFF);
file.write((wchar_t*)&s, 1); // file = std::wofstream
Во-первых, позвольте мне убедиться, что я понимаю, что делает этот фрагмент кода - это берет мой вар (который в основном является unsigned char, длиной 1 байт), преобразует его в unsigned int
(который имеет длину 4 байта и не очень переносимый) и использует & 0xFF
«извлекает» только младший байт.
Теперь, есть две вещи, которые я не понимаю:
- Почему превратить его в
unsigned int
в первую очередь, почему я не могу просто сделать что-то вроде
file.write((wchar_t*)&m_num, 1);
илиreinterpret_cast<wchar_t *>(&m_num)
? (Ref) - Как бы сериализовать более длинный тип, скажем,
uint64_t
(длиной 8 байтов)?unsigned int
здесь может быть или не быть.
Этот код является ужасным, не переносным и имеет неопределенное поведение. Он также нацелен на поток широких символов, которых вы, вероятно, не знаете. –
Привет @AlanStokes, спасибо за ваш комментарий. Не могли бы вы объяснить, почему этот код плохой и не переносимый? Что было бы более мудрым способом сделать это? – Asaf