Класс C++ для доступа к байтам / словам целого без знака
union LowLevelNumber
{
unsigned int n;
struct
{
unsigned int lowByte : 8;
unsigned int highByte : 8;
unsigned int upperLowByte : 8;
unsigned int upperHighByte : 8;
} bytes;
struct
{
unsigned int lowWord : 16;
unsigned int highWord : 16;
} words;
};
Этот союз позволяет мне получить доступ к целому байту без знака или по словам. Тем не менее, код выглядит довольно некрасиво:
var.words.lowWord = 0x66;
Есть ли способ, который позволил бы мне написать код, подобный этому:
var.lowWord = 0x66;
Обновить:
Это действительно о написании короткого / красивого кода, как в примере выше. Само решение для объединения действительно работает, я просто не хочу писать.words или.bytes каждый раз, когда получаю доступ к lowWord или lowByte.
5 ответов
union LowLevelNumber {
unsigned int n;
struct {
unsigned int lowByte : 8;
unsigned int highByte : 8;
unsigned int upperLowByte : 8;
unsigned int upperHighByte : 8;
};
struct {
unsigned int lowWord : 16;
unsigned int highWord : 16;
};
};
Обратите внимание на удаленный bytes
а также words
имена.
C++
Будет ли http://www.cplusplus.com/reference/stl/bitset/ служить вашим потребностям?
Обычная версия C будет выглядеть примерно так:
int32 foo;
//...
//Set to 0x66 at the low byte
foo &= 0xffffff00;
foo |= 0x66;
Это, вероятно, будет более удобным в будущем, чем написание собственного класса / объединения, потому что оно следует типичной C-фразеологии.
Ты можешь сделать
short& loword() { return (short&)(*(void*)&m_source); }
и используйте его, если вам все равно, скобки.
Или вы можете пойти в фантазии
public class lowordaccess
{
unsigned int m_source;
public:
void assign(unsigned int& source) { m_source = source; }
short& operator=(short& value) { ... set m_source }
operator short() { return m_source & 0xFF; }
}
а потом
struct LowLevelNumber
{
LowLevelNumber() { loword.assign(number); }
unsigned int number;
lowordaccess loword;
}
var.loword = 1;
short n = var.loword;
Последний метод - это эмуляция известных свойств в C++.
Вы можете легко обернуть это в классе и использовать методы доступа get/set.
Использование объединения для этого плохо, потому что оно не переносимо по порядку байтов.
Используйте функции доступа и реализуйте их с помощью битовых масок и сдвигов.