Python中的U8,U16,U32表示

时间:2015-11-26 16:17:06

标签: python struct

我有两个问题,两者都是相互关联的。

我的第一个问题是: 例如,我必须声明几个U8变量,U16和U48,然后必须将值传递给它们。传递值后,我必须将它们转换为二进制(一个二进制 - 所有这些组合)。我不知道如何执行这项任务 如何在python中定义U8,U16和U32(二进制)。我知道struct是一个模块。但是当我写作

ex=binascii.hexlify(struct.pack("I",1))

它返回b'01000000'而不是返回01000000。有没有其他方法可以做到(我需要它以U8格式)

我的第二个问题是:

如何将 U8 分解为 2MSbits 6LSbits

2 个答案:

答案 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。

对于一个字节:

  • 2 MSB:x >> 6
  • 6个LSB:x & ((1 << 6) - 1)