私は小道具に取り組む必要があります。バイナリファイル形式であり、構造体を使用してそれを実現したい。
構造体に定数バイトシーケンスが必要ですが、ATMではそれを実現する方法がわかりません。
私はそのようなことについて考えました:
#include <cstdint>
#pragma pack(push,1)
typedef struct PAYLOAD_INFO {
const uint8_t magicnumber[4] = { 0xFA, 0x11 , 0x28 , 0x33 };
uint16_t UMID;
const uint16_t VID = 1487 ;
uint32_t crc;
};
#pragma pack(pop)
int main (){
PAYLOAD_INFO pldInst;
pldInst.UMID = 5;
pldInst.crc = 0x34235a54;
...
writeToFile(&PAYLOAD_INFO,sizeof(PAYLOAD_INFO));
}
最終的に、「pldInst」は、この例のバイト順序に関係なく、(メモリ内で)そのように見えるはずです。
0x00000000: 0xFA, 0x11 , 0x28 , 0x33
0x00000004: 0x00, 0x05 , 0x05 , 0xCF
0x00000008: 0x34, 0x23 , 0x5a , 0x54
私はすでに「デフォルト」アプローチを試しました。
#include <cstdint>
#pragma pack(push,1)
typedef struct PAYLOAD_INFO {
static const uint8_t magicnumber[4];
uint16_t UMID;
static const uint16_t VID = 1487 ;
uint32_t crc;
};
const uint8_t magicnumber[4] = { 0xFA, 0x11 , 0x28 , 0x33 };
#pragma pack(pop)
しかし、意図したとおりには機能しません。
すべての構造体メンバーのメモリサイズを計算したり、新しいメモリを割り当てたり、すべてのメンバーをコピーしたりせずに、これを実行する方法はありますか?
g++4.6.3を使用しています。
よろしく、トーマス
更新:
@bikeshedderによって提供されるc ++ 11ソリューションは非常にうまく機能しますが、g++4.7以降でのみコンパイルされます。