Упаковка int в битовое поле в C++
Я конвертирую некоторый код из ASM в C++, ASM просто выглядит так:
mov dword ptr miscStruct, eax
Структура выглядит так:
struct miscStruct_s {
uLong brandID : 8,
chunks : 8,
//etc
} miscStruct;
Есть ли простой способ с одной строкой заполнить структуру в C++? Пока я использую:
miscStruct.brandID = Info[0] & 0xff; //Info[0] has the same data as eax in the ASM sample.
miscStruct.chunks = ((Info[0] >> 8) & 0xff);
Это прекрасно работает и все, но я должен заполнить 9-10 из этих структур битовых полей, некоторые из них имеют 30 нечетных полей. Таким образом, в результате получается 10 строк кода в 100+, что, очевидно, не так уж и здорово.
Так есть ли простой, чистый способ репликации ASM в C++?
Я, конечно, пытался "miscStruct = CPUInfo[0];" но C++ это не нравится, к сожалению.:(
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int'
..И я не могу редактировать структуру.
2 ответа
Дословный перевод инструкции ассемблера таков:
miscStruct=*(miscStruct_s *)&Info[0];
Приведения необходимы, потому что C++ - это язык, безопасный для типов, а ассемблер - нет, но семантика копирования идентична.
memcpy (&miscStruct, &CPUInfo[0], sizeof (struct miscStruct_s));
должно помочь
или просто
int *temp = &miscStruct;
*temp = CPUInfo[0];
Здесь я предположил, что тип CPUInfo
является int
, Вам необходимо настроить temp
тип указателя с типом данных CPUInfo
массив. Просто введите адрес памяти для структуры в тип массива и присвойте ему значение с помощью указателя.