Python 将负值转换为bytearray

Python 将负值转换为bytearray,python,python-2.7,Python,Python 2.7,我正在用Python测试串行通信,所以我需要将十六进制字符串转换成字节数组。 但现在我在用十六进制表示法表示负值时遇到了问题。 比方说,我想把十六进制16(十进制100)转换成字节数组;我将使用: myvalue = bytearray.fromhex("16") 但是如果我试图转换-100 myvalue = bytearray.fromhex("-16") 我得到一个值错误:在0位置的fromhex()arg中找到非十六进制数 具体地说,我必须使用串行API通过usb控制电机旋转。根据文

我正在用Python测试串行通信,所以我需要将十六进制字符串转换成字节数组。 但现在我在用十六进制表示法表示负值时遇到了问题。 比方说,我想把十六进制16(十进制100)转换成字节数组;我将使用:

myvalue = bytearray.fromhex("16")
但是如果我试图转换-100

myvalue = bytearray.fromhex("-16")
我得到一个值错误:在0位置的fromhex()arg中找到非十六进制数


具体地说,我必须使用串行API通过usb控制电机旋转。根据文档,我可以使用2字节有符号值指定介于-32768和32767之间的角度


那么,我应该怎么做呢?

当您使用bytearray.fromhex(“16”)时,您使用的是十六进制符号来描述您想要的位模式。在比特模式中,我们称之为符号是纯粹的常规。因此,正确的表示取决于接收进程是否需要有符号字节(可以表示数字-128到127)。如果是的话,那么它可能会期待一个二补表示。两位补码的诀窍是“倒转位加1”。因此,为了表示-1,您从二进制
0000 0001
开始,翻转位以获取
1111110
,然后添加1以获取
1111111
0xFF
)。同样,为了表示-100,您从二进制
0110100
0x64
,十进制100)开始,翻转位以获取
1001011
,并添加1以获取
1001100
0x9C

如您所见,我对您将
0x16
与十进制100等同有一个问题。在我的书中,
0x16
是十进制22:
0x64
是十进制100。如上所示,
0x64
的两个补码是
0x9C
。要从
-100
到达目的地,请执行以下操作:

>>> bytearray([256-100])
bytearray(b'\x9c')
在Python中,这比翻转位并添加1更容易

要表示一个2字节的负数,您需要做一些类似的事情。要得到7位整数(最多127位)的2的补码,可以从256中减去。从65536(不是32767)中减去15位整数(最高32767)的2的补码

表示10000的负角度:执行此操作65536-10000=55536。其位模式为
0xD8F0
,即
bytearray([0xd8,0xf0])


与负字节一样,由接收器决定是将该位模式解释为55536还是-10000。您正在谈论的设备需要一个有符号的16位整数(范围-32768..32767),因此可以依赖它将位模式
0xD8F0
解释为-10000,而不是55536。没有值冲突,因为55536超出了允许的范围。

当您使用bytearray.fromhex(“16”)时,您使用的是十六进制表示法来描述所需的位模式。在比特模式中,我们称之为符号是纯粹的常规。因此,正确的表示取决于接收进程是否需要有符号字节(可以表示数字-128到127)。如果是的话,那么它可能会期待一个二补表示。两位补码的诀窍是“倒转位加1”。因此,为了表示-1,您从二进制
0000 0001
开始,翻转位以获取
1111110
,然后添加1以获取
1111111
0xFF
)。同样,为了表示-100,您从二进制
0110100
0x64
,十进制100)开始,翻转位以获取
1001011
,并添加1以获取
1001100
0x9C

如您所见,我对您将
0x16
与十进制100等同有一个问题。在我的书中,
0x16
是十进制22:
0x64
是十进制100。如上所示,
0x64
的两个补码是
0x9C
。要从
-100
到达目的地,请执行以下操作:

>>> bytearray([256-100])
bytearray(b'\x9c')
在Python中,这比翻转位并添加1更容易

要表示一个2字节的负数,您需要做一些类似的事情。要得到7位整数(最多127位)的2的补码,可以从256中减去。从65536(不是32767)中减去15位整数(最高32767)的2的补码

表示10000的负角度:执行此操作65536-10000=55536。其位模式为
0xD8F0
,即
bytearray([0xd8,0xf0])


与负字节一样,由接收器决定是将该位模式解释为55536还是-10000。您正在谈论的设备需要一个有符号的16位整数(范围-32768..32767),因此可以依赖它将位模式
0xD8F0
解释为-10000,而不是55536。值之间没有冲突,因为55536超出了允许的范围。

十六进制中没有“-”符号,负值只是“表示”。这个答案对你有帮助。它演示了如何将负十进制数转换为十六进制表示。一旦可以这样做,您只需将结果作为字符串传递给bytearray.fromhex。Hex 16根本不是十进制100。它是
1*16**1+6*16**0=22
。此外,bytearray使用无符号字节,并且没有负数的概念。您可能需要查看结构或数组模块。你想实现什么?我必须通过usb控制万向节旋转;根据文档,我可以指定正负值来设置角度半径。在十六进制中没有“-”符号,负值只是“表示”。这个答案对你有帮助。它演示了如何将负十进制数转换为十六进制表示。一旦可以这样做,您只需将结果作为字符串传递给bytearray.fromhex。Hex 16根本不是十进制100。它是
1*16**1+6*16**0=22
。此外,bytearray使用无符号字节,并且没有负数的概念。您可能需要查看结构或数组模块。你想达到什么目的?我必须控制