如果您有一个字节字符串并且想要去除最右边的八个位(即一个字节),您可以直接从字节字符串中简单地去除它:
>>> b'\x93\x4c\x00'[:-1]
b'\x93L'
如果您想将其转换为整数,则可以使用Python的
struct对其进行解包。正如您正确指出的那样,您需要一个固定的大小来使用结构体,因此您只需填充字节字符串以添加所需数量的零即可:
>>> data = b'\x93\x4c\x00'
>>> data[:-1]
b'\x93L'
>>> data[:-1].rjust(4, b'\x00')
b'\x00\x00\x93L'
>>> struct.unpack('>L', data[:-1].rjust(4, b'\x00'))[0]
37708
当然,你也可以先将其转换,然后从结果整数中移除8位。
>>> struct.unpack('>Q', data.rjust(8, b'\x00'))[0] >> 8
37708
如果您想确保实际解释的位数不超过13位(第8到21位),当然需要应用位掩码0x1FFF
:
>>> 37708 & 0x1FFF
4940
如果您需要大端序,只需分别使用
<L
或
<Q
即可。
如果你真的按照从左到右计算比特(这很不寻常,但可以接受),那么你也可以使用这种填充技术:
>>> struct.unpack('>Q', data.ljust(8, b'\x00'))[0] >> 43
1206656
请注意,我们将填充添加到另一侧,并将其向左移动43位(您的3位加上5个字节用于我们不需要查看的填充数据)。
my $i = ( unpack('N', substr("\x00\x00".$s, -4)) >> 8) & 0x1FFF;
。 - ikegami\x4c
字节的最后一位,第16到21位是第一个字节最右边的5位。您的移位3意味着您正在从左到右计算位;也许您正在寻找不同于传统的一组位? - Martijn Pieters