Нам нужно поддерживать 3 аппаратные платформы — Windows (маленький Endian) и Linux Embedded (большой и Little Endian). Наш поток данных зависит от машины, которую он использует, и данные должны быть разбиты на битовые поля.
Я хотел бы написать один макрос (если это возможно), чтобы абстрагироваться от деталей. На Linux я могу использовать bswap_16
/bswap_32
/bswap_64
для преобразования Little Endian.
Тем не менее, я не могу найти это в моих Visual C ++ включает.
Существует ли общая встроенная функция для обеих платформ (Windows и Linux)?
Если нет, то что я могу использовать в Visual C ++ для замены байтов (кроме того, чтобы написать сам — надеясь, что некоторые машины оптимизированы для встроенного)?
Благодарю.
На обеих платформах у вас есть
за short
(16 бит): htons()
а также ntohs()
за long
(32 бит): htonl()
а также ntohl()
Пропажа htonll()
а также ntohll()
за long long
(64bit) может быть легко построен из этих двух. Увидеть эта реализация например.
Update-0:
В приведенном выше примере Саймон Рихтер упоминает в комментарии, что это не обязательно должно работать. Причина этого в том, что компилятор может вводить дополнительные байты где-нибудь в используемых объединениях. Чтобы обойти это, профсоюзы должны быть упакованы. Последнее может привести к снижению производительности.
Итак, вот еще один отказоустойчивый подход к созданию *ll
функции: https://stackoverflow.com/a/955980/694576
Обновление-0,1:
Из комментария bames53 я склоняюсь к выводу, что 1-й пример, связанный выше, должен использоваться не с C ++, а только с C.
Update-1:
Для достижения функциональности *ll
функции в Linux этот подход может быть «лучшим».
Не те же имена, но те же функции существовать.
htons и htonl (и подобные макросы) хороши, если вы настаиваете на байт-сексе.
Однако гораздо лучше обойти проблему, выводя ваши данные в формате ASCII или аналогичном. Это занимает немного больше места, и это передает через сеть немного медленнее, но простота и защита будущего стоят того.
Другой вариант состоит в том, чтобы численно разобрать ваши int и short. Так что вы & 0xff и делим на 256 повторно. Это дает единый формат для всех архитектур. Но у ASCII все еще есть преимущество, потому что с ним легче отлаживать.