我有两个问题,两者都是相互关联的。
我的第一个问题是:
例如,我必须声明几个U8变量,U16和U48,然后必须将值传递给它们。传递值后,我必须将它们转换为二进制(一个二进制 - 所有这些组合)。我不知道如何执行这项任务
如何在python中定义U8,U16和U32(二进制)。我知道struct
是一个模块。但是当我写作
ex=binascii.hexlify(struct.pack("I",1))
它返回b'01000000'
而不是返回01000000
。有没有其他方法可以做到(我需要它以U8格式)
我的第二个问题是:
如何将 U8 分解为 2MSbits 和 6LSbits
答案 0 :(得分:2)
我必须声明几个U8变量,U16和U48,然后必须将值传递给它们。
Python是变量的动态类型语言,不具有固定类型,您的值的类型将取决于它所拥有的值。也就是说,在python中有一个整数类型(int
),并且它可以包含任何有符号整数,如果你的数字很大,它将自动转换为bigint。
E.g。
var1 = 256 # A plain integer
var2 = 4294967296L # Bigger than 2**31, it has to be prefixed with an L
由于存在单个整数类型,如果要将变量限制为保持给定的二进制宽度,则应掩盖LSBits。
E.g。
bignum = 2**50 - 1
only_8_lsb = bignum & 0xFF
only_16_lsb = bignum & 0xFFFF
only_48_lsb = bignum & (2**49 - 1)
传递值后,我必须将它们转换成二进制文件(一个二进制文件 - 所有这些组合在一起)。
从技术上讲,这些数字已经存储为二进制数据。如果要显示数字的二进制表示,则必须将其保存在字符串中,并且可以使用格式
E.g。将数字转换为零重叠的8位二进制表示
> "{0:08b}".format(0b11000011)
'11000011'
E.g。将数字转换为零重叠的16位二进制表示
> "{0:016b}".format(0xCAFE)
'1100101011111110'
希望你注意到你可以用不同的方式指定一个整数。
如何将U8分解为2MSbits和6LSbits
除非您需要其他表示,否则请使用其他答案中所述的位运算符。
struct
有其他用途,它允许您将一些python值转换为字节字符串,其他语言也会在内存中看到它们。并且你得到一个b
前缀字符串,因为在Python 3中str
用于存储unicode代码点,而bytes
用于存储原始字节(&#34;数字和#的序列) 34;在0 <= chr > 256
)范围内。
答案 1 :(得分:1)
目前还不清楚你想要什么,但是你可以使用位操作来提取MSB和LSB。
对于一个字节:
x >> 6
x & ((1 << 6) - 1)