【问题标题】:Converting lower and upper 8 bits into one value with python用python将低8位和高8位转换为一个值
【发布时间】:2021-08-15 13:52:16
【问题描述】:

我有这样的配对:(-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)

【问题讨论】:

  • 预期输出是什么?
  • 输入(-102,-56)时的预期输出是什么?对于 (123, -56)?
  • 不幸的是我不知道。我所知道的就是我在问题中描述的内容。

标签: python binary data-conversion signed


【解决方案1】:

按位运算很好,但不是严格要求。

在最常见的 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

【讨论】:

    【解决方案2】:

    只是猜测

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 1970-01-01
        • 2013-11-03
        • 2012-07-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2019-05-23
        相关资源
        最近更新 更多