2011-07-30 5 views
2

にビットフィールドにint型をパッキング:私はASMは、単純にそうように見える、C++にASMからいくつかのコードを変換していますC++

mov dword ptr miscStruct, eax 

のように構造体に見える:

struct miscStruct_s { 
    uLong brandID  : 8, 
    chunks   : 8, 
    //etc 
} miscStruct; 

がありますC + +で構造体を埋めるための簡単な1-2行の方法? は、これまで私が使用しています:罰金と、すべての作品が、私はこれらのビットフィールドの構造体のいくつかの9-10を入力する必要があり、そのうちのいくつかは、30個の奇数フィールドを持っている

miscStruct.brandID = Info[0] & 0xff; //Info[0] has the same data as eax in the ASM sample. 
miscStruct.chunks = ((Info[0] >> 8) & 0xff); 

を。だから、このようにして10行のコードを100+にすることは、明らかにそれほど大きくはありません。

C++でASMを複製するにはシンプルでクリーンな方法がありますか?

私はもちろん "miscStruct = CPUInfo [0];"しかし、C++はあいにくそれを好きではありません。 :(

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

..And私は、構造体を編集することはできません。

+0

私が使用して終了: '* reinterpret_castは(&miscStructを)=情報[0];' – Riley

答えて

1

アセンブラ命令の直訳はこれです:アセンブラはありませんが、コピーのセマンティクスが同一であるのに対し、C++は、タイプセーフな言語であるため、

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

キャストが必要とされています。

+0

私はあなたの例に基づいてそれを逆にしてしまった。 * reinterpret_cast (&miscStruct)=情報[0]; ちょっとファンキーですが、それは仕事をするようです。 – Riley

+0

@Riley、どちらの作品でも、両者の主な違いは、あなたが「真の」長さと考える側です。個人的に私はインメモリオブジェクト( 'miscStruct')を実際の長さにすることで上書きすることはできませんが、あなたの例では後で' miscStruct'を変更してcharを1つしか持たないと、メモリ。 – Blindy

1

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

役立つはずです。

または単に

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

私が持っていますタイプはCPUInfointです。 tempポインタ型をCPUInfo配列のデータ型で調整する必要があります。構造体のメモリアドレスを配列の型に単にキャストし、ポインタを使用してそこに値を代入します。

+0

のmemcpy(&miscStruct、&cpuinfoの[0]、はsizeof(miscStruct)); – Ajay

関連する問題