переносимое байтовое преобразование со знаком / без знака, C ++ - PullRequest
1 голос
/ 07 декабря 2009

Я использую приведение байтов со знаком к беззнаку (int8_t) для упаковки байтов.

uint32_t(uint8_t(byte)) << n

Это работает с использованием GCC на Intel Linux. Это портативно для других платформ / компиляторов, например PowerPC? Есть ли лучший способ сделать это? использование bitset невозможно в моем случае. Я использую stdint через boost

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

Он не переносимый, так как типы uint32_t и uint8_t не являются частью стандарта C ++. Все такие преобразования по своей природе зависят от реализации.

2 голосов
/ 07 декабря 2009

Если вы используете boost/cstdint.hpp из библиотеки Boost Integer, тогда да, typedefs являются переносимыми (кроссплатформенными.) Заголовок boost/cstdint.hpp предназначен для реализации функциональности C99 stdint.h в C ++.

Из документации Boost :

Заголовок обеспечивает typedef, полезный для написание переносимого кода, который требует определенные целочисленные ширины. Все typedef's находятся в усилении пространства имен.

1 голос
/ 07 декабря 2009

На практике да, скорее всего, он будет работать на большинстве других платформ, с которыми вы сталкиваетесь (особенно если на него портирован Boost). Однако, если вы записываете эти упакованные значения в файлы или сетевые сокеты, вам придется иметь дело с порядком байтов (ваш пример PowerPC имеет порядок байтов с прямым порядком байтов, в то время как у Intel есть порядок байтов с прямым порядком байтов). В этом отношении код будет вести себя по-разному на разных аппаратных архитектурах.

...