Поддержка Big Endian и Little Endian для упорядочения байтов

Нам нужно поддерживать 3 аппаратные платформы — Windows (маленький Endian) и Linux Embedded (большой и Little Endian). Наш поток данных зависит от машины, которую он использует, и данные должны быть разбиты на битовые поля.

Я хотел бы написать один макрос (если это возможно), чтобы абстрагироваться от деталей. На Linux я могу использовать bswap_16/bswap_32/bswap_64 для преобразования Little Endian.

Тем не менее, я не могу найти это в моих Visual C ++ включает.

Существует ли общая встроенная функция для обеих платформ (Windows и Linux)?

Если нет, то что я могу использовать в Visual C ++ для замены байтов (кроме того, чтобы написать сам — надеясь, что некоторые машины оптимизированы для встроенного)?

Благодарю.

5

Решение

На обеих платформах у вас есть

за 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 этот подход может быть «лучшим».

12

Другие решения

Не те же имена, но те же функции существовать.

2

htons и htonl (и подобные макросы) хороши, если вы настаиваете на байт-сексе.

Однако гораздо лучше обойти проблему, выводя ваши данные в формате ASCII или аналогичном. Это занимает немного больше места, и это передает через сеть немного медленнее, но простота и защита будущего стоят того.

Другой вариант состоит в том, чтобы численно разобрать ваши int и short. Так что вы & 0xff и делим на 256 повторно. Это дает единый формат для всех архитектур. Но у ASCII все еще есть преимущество, потому что с ним легче отлаживать.

2
По вопросам рекламы [email protected]