#cpp #битовые_операции #кроссплатформенность
Как добиться кроссплатформенности при сериализации, работе напрямую с битами, составления пакетов для отправки между классами при условии, что битовые манипуляции должны быть верны при little endian и big endian.
Ответы
Ответ 1
При общении в пределах одной системы учитывать порядок байт нет смысла. все потоки, процессы и т.п. работают с одним порядком. Вопрос встает только при передаче информации на другую платформу. Т.е. данные должны быть приведены к заранее оговоренному порядку байт только при передаче по сети или при записи в файлы, которые могут быть впоследствии перенесены на другую систему.Ответ 2
В полях структур, используемых для обмена, храните данные в сетевом формате (network order, подробнее можете посмотреть здесь). Для преобразования данных между сетевым форматом и форматом хоста можно использовать функции htons()/htonl()/ntohs()/ntohl() из Berkeley sockets API.Ответ 3
Внутри байта биты всегда идут слева направо от старшего к младшему, независимо от принятого порядка байтов в системе. То же самое касается операндов у операторов >> <<, даже если это числа, состоящие из больше чем 1-го байта. То есть int i=4; i>>=1; i всегда будет равно 2. Для кроссплатформенной (де)сериализации можно использовать htons()/htonl()/ntohs()/ntohl()
Комментариев нет:
Отправить комментарий