Python:如何将 32 位有符号长整数转换为 7 位整数

Posted

技术标签:

【中文标题】Python:如何将 32 位有符号长整数转换为 7 位整数【英文标题】:Python: How to Convert 32-bit Signed Long to 7-bit ints 【发布时间】:2020-06-27 09:06:57 【问题描述】:

为了通过 Firmata/串行链接传输它们,将 32 位有符号长整数转换为 7 位整数的最佳方法是什么(在 Python 中)?转成8位没问题,(long_val).to_bytes(4, 'little')就行了。最终的顺序应该是这样的:

No 1, bits 0-6
No 2, bits 7-13
No 3, bits 14-20
No 4, bits 21-27
No 5, bits 28-32

从 7 位整数的 5 项序列向后转换为 32 位有符号长整数也很有帮助。

s = bin(pos)[2:].zfill(32)
cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no,
int(s[28:32], 2), int(s[21:28], 2), int(s[14:21], 2),
int(s[7:14], 2), int(s[0:7], 2)])
brd.send_sysex(acc.ACCELSTEPPER_DATA, cmd)

不幸的是,我的方法产生了错误的结果,所以我想完全放弃它们并从头开始。 提前感谢您的任何建议。

【问题讨论】:

我怀疑是否有一些可以使用的内置方法。但是,您知道bin(long_val) 为您提供了long_val 的二进制表示吗?也许您可以将此表示形式用作字符串来提取 7 位组。 这产生了更有意义的结果,解码值大约是 reuqired 的 4 倍。还是错了。 s = bin(pos)[2:].zfill(32) cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no, int(s[28:32], 2), int(s[21:28], 2), int(s[14:21], 2), int(s[7:14], 2), int(s[0:7], 2)]) 【参考方案1】:

一次只进行 7 位转换:

bytes = []
for i in range(5):
    bytes.append(long_value & 0x7f)
    long_value >>= 7
long_value = 0
for i in reversed(range(5)):
    long_value <<= 7
    long_value |= bytes[i]

【讨论】:

【参考方案2】:

它不完全是 7 位,但听起来像是 base64 coding 的工作。如果您只需要通过 7 位通道传输数据,那么 base64 应该适合您。当然,您的数据流会稍长一些,即 6 个字节而不是 5 个。

下面是你可以用 Python 编写它的方法:

import base64

def encode_number(n):
    """Takes an int and returns a bytes object in base64 encoding."""
    return base64.b64encode(n.to_bytes(4, byteorder='little'))

def decode_number(b):
    """Takes a bytes object in base64 encoding and returns an int."""
    return int.from_bytes(base64.b64decode(b), byteorder='little')

如果您需要超过 32 位的数字,只需在此处更改第 5 行中的 4

【讨论】:

对不起,它不是 base64。 bin(int_32bit_signed)[2:] 转换为二进制,但无论出于何种原因将其切片为 7 位块都不起作用 @CNCman 我不确定我是否理解您要做什么。 base64 编码中的每个字节只占用 7 位(最高位始终为 0)。也许您可以告诉我们您是如何传输数据的……? 它是通过 Firmata 串行链路进行的数据传输。 32 位有符号长编码,如主题中所述。我使用了这段代码,但它不能正常工作(在接收端没有正确解码)。 s = bin(pos)[2:].zfill(32) cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no, int(s[28:32], 2), int(s[21:28], 2), int(s[14:21], 2), int(s[7:14], 2), int(s[0:7], 2)])

以上是关于Python:如何将 32 位有符号长整数转换为 7 位整数的主要内容,如果未能解决你的问题,请参考以下文章

将 8 个字节转换为有符号长整数(64 位)

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

C#Winform基础 十进制整数转换为32位有符号二进制数

如何在 IA32 上将带符号的整数相加成更大的和。 32位有符号整数的64位总和?

2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string(

c#中的textbox输入数值如何运算?