2012-05-25 33 views
1

我正在研究Windows和Linux的EBDS協議接口。我試圖將協議所需的所有數據打包到結構中,然後將結構本身和所有其他東西寫入串行端口,並將其發送到設備。爲什麼enum與Windows中的位字段不兼容?

該協議的第一部分是數據封裝和封裝的部件中的一個是控制字節即配襯這樣的描述:

Bit 0: Acknowledgement bit (switchs between 0 and 1 in each send). 
Bit 1 to 3: Device Type. 
Bit 4 to 6: Message Type. 
Bit 7: Unused. 

爲了處理TIS控制字節我創建了兩個枚舉和一個結構:

enum E_DEVICE_TYPE 
{ 
    E_BILL_ACCEPTOR_WITH_SINGLE_ESCROW = 0x0, // 000 
    E_RESERVED_1 = 0x1, // 001 
    E_RESERVED_2 = 0x2, // 010 
    E_RESERVED_3 = 0x3, // 011 
    E_RESERVED_4 = 0x4, // 100 
    E_RESERVED_5 = 0x5, // 101 
    E_RESERVED_6 = 0x6, // 110 
    E_RESERVED_7 = 0x7, 
}; 

enum E_MESSAGE_TYPE 
{ 
    E_RESERVED = 0x0, 
    E_STANDARD_OMNIBUS_COMMAND = 0x1, 
    E_NOT_USED = 0x2, 
    E_OMNIBUS_WITH_BOOKMARK_MODE = 0x3, 
    E_CALIBRATE_REQUEST = 0x4, 
    E_FIRMWARE_DOWNLOAD_REQUEST = 0x5, 
    E_AUXILIARY_COMMAND_REQUEST = 0x6, 
    E_EXTENDED_COMMANDS = 0x7, 
}; 

#ifndef LINUX 
#pragma pack(1) 
#endif 
struct sControlByte 
{ 
    sControlByte(bool aAcknowledgeFlag, E_DEVICE_TYPE aDeviceType, E_MESSAGE_TYPE aMessageType); 

    const bool mACK : 1; 
    const E_DEVICE_TYPE mDevice : 3; 
    const E_MESSAGE_TYPE mMessageType : 3; 
    const bool mUnused : 1; 
#ifdef LINUX 
}__attribute__((packed)); 
#else 
}; 
#endif 

當我問sControlByte的大小結構的值等於6的Windows編譯(Visual Studio 2010中),但在Linux(使用gcc 4.2.3)的結構的大小爲1,符合市場預期。

我試圖擺脫兩個平臺上所需屬性的對齊方式,但我不知道我錯過了什麼¿爲什麼尺寸會根據平臺而變化? ¿我正在使用正確的屬性來控制對齊?

在此先感謝。

+2

VS編譯器也有pack()編譯指示,所以你不需要ifndef它。 –

+0

@Directry ifndef LINUX允許pack()_only_用於MSVC,所以你絕對需要它。 – harper

+0

@harper你說得對,我忽略了它。 –

回答

4

C++標準並未指定如何精確佈置位字段。許多編譯器會爲每個位字段組件使用常規整數,這意味着處理速度更快,但結構更大,除非您指定了您在Linux中完成的不同首選項。

請參閱here VS2010使用的算法。

編輯:您的代碼存在問題。請記住,使用帶符號的基本類型,位字段的一位將被符號位使用。並且您的枚舉(像大多數人一樣)可能會被簽名(無論它們是否是實現定義的),因此當您將E_EXTENDED_COMMANDS存儲在mMessageType中時可能會看到意外,並立即發現的值不存在

有了最近的編譯器,你可以force the enums to be unsigned並避免這個問題。

+0

好奇,我認爲,由於涉及位字段,該字段的基本類型對於使用代碼而不是大小的另一件事無關緊要。 –

+1

@PaperBirdMaster - 確實如此。然而,當它們未被打包時,訪問比特字段的組件通常更快,因爲那麼不需要在代碼生成級別上不同地移位和掩蓋相鄰字段。順便說一句,我剛剛注意到你的結構可能根本無法在某些平臺上工作,請參閱編輯答案。 –

相關問題