首先,我還是個學生。所以我不是很有經驗。C中的字節如何存儲?
我正在使用一塊藍牙硬件,並使用其協議發送命令。協議要求數據包首先以每個數據包字段的LSB發送。
我收到錯誤信息包給我,說明我的CRC值錯了,所以我做了一些調查。我發現了這個問題,但我在這個過程中感到困惑。
以下是一些GDB輸出和其他信息,闡明瞭我的困惑。
我送一包看起來應該像這樣的:
|Start Flag| Packet Num | Command | Payload | CRC | End Flag|
0xfc 0x1 0x0 0x8 0x0 0x5 0x59 0x42 0xfd
下面是一些GDB輸出:
print /x reqId_ep
$1 = {start_flag = 0xfc, data = {packet_num = 0x1, command = {0x0, 0x8}, payload = {
0x0, 0x5}}, crc = 0x5942, end_flag = 0xfd}
reqId_ep是我送包的變量名。它看起來一切都很好,但是我收到來自它的CRC錯誤代碼,所以一定是錯誤的。
在這裏,我檢查十六進制9個字節,從我的包的地址開始發送:
x/9bx 0x7fffffffdee0
0xfc 0x01 0x00 0x08 0x00 0x05 0x42 0x59 0xfd
而且這裏的問題變得很明顯。 CRC不是LSB第一。 (0x42 0x59)
要解決我的問題,我刪除了htons(),我設置了我的CRC值等於。
這裏是上面相同的輸出,而不htons():
p/x reqId_ep
$1 = {start_flag = 0xfc, data = {packet_num = 0x1, command = {0x0, 0x8}, payload = {
0x0, 0x5}}, crc = 0x4259, end_flag = 0xfd}
這裏的CRC值不LSB。
但後來:
x/9bx 0x7fffffffdee0
0xfc 0x01 0x00 0x08 0x00 0x05 0x59 0x42 0xfd
這裏的CRC值LSB第一。
所以顯然C的存儲是LSB第一?有人能爲這種情況投下一些知識嗎?非常感謝你。
這取決於您正在運行的處理器。大於一個字節的數字值可以存儲爲「big-endian」或「little-endian」。 (谷歌的條款和研究。) –