當您使用bytearray.fromhex("16")
時,您使用十六進制表示法來描述所需的位模式。在一個位模式中,我們所說的符號純屬傳統。所以正確的表示取決於接收過程是否期待有符號的字節(可以表示數字-128到127)。如果是,那麼它可能會期待一個補碼的表示。二進制補充的配方是「翻轉位並加1」。因此,爲了表示-1,你以二進制0000 0001
開始,翻轉這些位得到1111 1110
並加1得到1111 1111
(0xFF
)。同樣,爲了表示-100,你以二進制0110 0100
(0x64
,十進制100)開始,翻轉這些位得到1001 1011
並加1得到1001 1100
(0x9C
)。
正如你所看到的,我有一個問題,你用十進制100等同0x16
在我的書,0x16
是十進制22:0x64
是十進制100如上所示,0x64
二進制補碼是0x9C
。從-100
那裏做到這一點:
>>> bytearray([256-100])
bytearray(b'\x9c')
也就是說在Python比翻轉位和添加1
要表示2字節負數容易,你需要做的事情類似。要獲得7位整數(最多127)的二進制補碼,可以從256中減去。要從65,536(而不是 32,767)中減去15位整數的二進制補碼(最多32,767)。
要表達10,000的負角度,請執行此操作65,536 - 10,000 = 55,536。該位模式爲0xD8F0
,即bytearray([0xd8, 0xf0])
。
與負字節一樣,接收器是否會將該位模式解釋爲55,536或-10,000。您正在通話的設備需要一個有符號的16位整數(範圍-32768..32767),因此可以依靠它來將位模式0xD8F0
解釋爲-10,000而不是55,536。沒有值的衝突,因爲55,536不在允許範圍內。
十六進制中沒有「 - 」符號,負值只是「表示」。 [閱讀此](https://en.wikipedia.org/wiki/Two%27s_complement) –
此答案將幫助你[這裏](https://stackoverflow.com/questions/7822956/how-to-convert-negative -integer值對十六進制中的Python)。它顯示瞭如何將負數十進制數轉換爲十六進制表示。一旦你可以做到這一點,你只需將結果作爲字符串傳遞給'bytearray.fromhex'。 –
十六進制16根本不是十進制100。它是'1 * 16 ** 1 + 6 * 16 ** 0 = 22'。另外,bytearray使用無符號字節,並沒有負數的概念。您可能想要查看結構或數組模塊。你想達到什麼目的? –