我正在嘗試為只有機器人作業系統包的激光雷達傳感器撰寫 python 驅動程式。
我能夠在 Raspberry Pi 上進行通信,并且獲得了我需要的資料。
我以前從未真正使用過位元組陣列,甚至 python 對我來說也很新。
收到的資料看起來像這樣(png),但您也可以查看檔案(pdf)。
所以如果我沒記錯的話,我必須像這樣將三個位組合成兩個:
[0x5D, 0xC7, 0xD0] => [0x5DC, 0x7D0]
我認為前面提到的機器人作業系統庫在這里可以做到這一點,但我的 c 甚至比我的 python 還要糟糕 :)
在獲得正確的資料后,我想將其排序為 2D 陣列,但這不是問題。
您能否指出我正確的方向,或者只是建議如何尋找解決方案?
謝謝您的幫助
uj5u.com熱心網友回復:
所以這是一種解決方案(可能不是最干凈的,但它是位操作......):
arr = [0x5D, 0xC7, 0xD0]
byte_0 = arr[0] << 4 | (arr[1] >> 4)
byte_1 = (arr[1] & 0xF) << 8 | arr[2]
我會嘗試一步一步地完成這個。這三個位元組以二進制表示:
0b0101_1101
0b1100_0111
0b1101_0000
<<操作員是班次操作員。它將位向左移動指定的數量。將此應用于第一個位元組會產生:
0b0101_1101 << 4 = 0b0101_1101_0000,有效地在末尾附加四個零。>>算子基本上和算子是等價的,<<只是反過來說。當位低于位置 0 時,它會丟棄位:
0b1100_0111 >> 4 = 0b1100
最后,|運算子是邏輯“或”運算子。如果一個或兩個初始位為“1”,則它執行逐位或運算,其中每個結果位為“1”。只有當兩個位都為“0”時才為“0”。到目前為止,我們可以利用它來“覆寫”我們結果的低四位的內容。請注意,為簡單起見,我省略了前導零,但這里是用零填充的數字
0b0101_1101_0000 | 0b0000_0000_1100 = 0b0101_1101_1100. 你有你的第一個號碼。現在請注意,這不是一個位元組,而是您現在需要 12 位來表示數字。
第二個位元組也是如此。這里唯一新的是邏輯與運算子 ( &)。僅當兩個位都為“1”時,此運算子才會產生“1”。我們可以使用它來屏蔽位元組中感興趣的部分:
0b1100_0111 & 0x1111 = 0b0111
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410779.html
標籤:
上一篇:簡單函式模板中的編譯錯誤
