Упаковка 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 массив. Просто введите адрес памяти для структуры в тип массива и присвойте ему значение с помощью указателя.

Другие вопросы по тегам