用python将低8位和高8位转换为一个值

问题描述

我有这样的对:(-102,-56),(123,-56)。对中的第一个值表示低 8 位,第二个值表示高 8 位,均为有符号十进制形式。我需要将这些对转换为单个 16 位值。

我想我可以通过以下方式转换 (-102,-56) 对:

l = bin(-102 & 0b1111111111111111)[-8:]
u = bin(-56 & 0b1111111111111111)[-8:]
int(u+l,2)

但是当我尝试对 (123,-56) 对执行相同操作时,出现以下错误

ValueError: invalid literal for int() with base 2: '11001000b1111011'

我知道这是由于不同值的长度不同,我需要将它们填充到 8 位。

我这样做是完全错误的吗?这样做的最佳方法是什么,以便它同时适用于负值和正值?

更新: 我能够通过以下方式解决此问题:

low_int = 123
up_int = -56
(low_int & 0xFF) | ((up_int & 0xFF) << 8)

解决方法

您可以尝试将第一个值移动 8 位:尝试使用此处描述的逻辑 https://stackoverflow.com/a/1857965/8947333

,

只是猜测

l,u = -102 & 255,-56 & 255
# shift 8 bits to left
u << 8 + l
,

按位运算可以,但不是严格要求。

在最常见的 8 位 2 的补码表示中:

-1 signed == 255 unsigned
-2 signed == 254 unsigned
...
-127 signed = 129 usigned
-128 signed = 128 usigned

简单地说,两个绝对值总和为 256。

使用它来转换负值:

if b < 0:
    b += 256

然后组合高低字节:

value = 256 * hi8 + lo8