переносимое преобразование знаковых и беззнаковых байтов, C++
-
16-09-2019 - |
Вопрос
Я использую приведение знака к беззнаковому байту (int8_t) для упаковки байтов.
uint32_t(uint8_t(byte)) << n
Это работает с использованием GCC в Intel Linux.Это переносимо для других платформ/компиляторов, например PowerPC?есть ли лучший способ сделать это?использование битсета в моем случае невозможно.Я использую stdint через boost
Решение
Если вы используете boost/cstdint.hpp
из библиотеки Boost Integer, то да, определения типов являются переносимыми (кроссплатформенными). boost/cstdint.hpp
заголовок предназначен для реализации функций C99 stdint.h в C++.
Заголовок обеспечивает полезное для написания портативного кода Typedef, который требует определенной целочисленной ширины.Все Typedef находятся в повышении пространства имен.
Другие советы
Он непереносим, поскольку типы uint32_t и uint8_t не являются частью стандарта C++.Все подобные манипуляции по своей сути зависят от реализации.
На практике да, скорее всего, он будет работать на большинстве других платформ, с которыми вы сталкиваетесь (особенно если на него портирован Boost).Однако если вы записываете эти упакованные значения в файлы или сетевые сокеты, вам придется иметь дело с порядком байтов (в вашем примере PowerPC имеет обратный порядок байтов, а у Intel — прямой порядок байтов).В этом отношении код будет вести себя по-разному на разных аппаратных архитектурах.