2011-07-30 68 views
2

我把一些代碼ASM到C++,ASM的只是看起來像這樣:包裝一個int到C++位域

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+,這顯然不是那麼好。

那麼在C++中複製ASM有沒有一種簡單,乾淨的方法?

我當然試過「miscStruct = CPUInfo [0];」但不幸的是C++不喜歡。 :(

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' 

..和我不能編輯結構

+0

我最終使用: '*的reinterpret_cast (&miscStruct)=信息[0];' – Riley

回答

1

彙編指令的直譯是這樣的:

miscStruct=*(miscStruct_s *)&Info[0]; 

需要的強制轉換,因爲C++是一種安全的語言,而彙編不大,但複製的語義是相同的。

+0

根據你的例子,我最終做了倒退。 * reinterpret_cast (&miscStruct)= Info [0]; 這有點時髦,但它似乎做的工作。 – Riley

+0

@Riley,不管做什麼,兩者之間的主要區別在於你認爲哪一方是「真實」的長度。就我個人而言,我會選擇內存中的對象('miscStruct')爲真正的長度,所以你永遠不會覆蓋它,而在你的例子中,如果你稍後改變'miscStruct'只有一個字符,你會破壞你的記憶。 – Blindy

1

memcpy (&miscStruct, &CPUInfo[0], sizeof (struct miscStruct_s));

應該有所幫助。

或者乾脆

int *temp = &miscStruct; 
*temp = CPUInfo[0]; 

在這裏,我有假定的類型是int。您需要使用CPUInfo數組的數據類型調整temp指針類型。只需將結構的內存地址轉換爲數組的類型,並使用指針將值分配到那裏。

+0

的memcpy(&miscStruct,cpuinfo中和[0],的sizeof(miscStruct)); – Ajay