在python中将字节转换为位

use*_*832 26 python hex byte bits

我正在使用Python3.2.我需要将十六进制流作为输入并在位级解析它.所以我用过

bytes.fromhex(input_str)

将字符串转换为实际字节.现在我如何将这些字节转换为位?

Ale*_*lds 32

另一种方法是使用bitstring模块:

>>> from bitstring import BitArray
>>> input_str = '0xff'
>>> c = BitArray(hex=input_str)
>>> c.bin
'0b11111111'
Run Code Online (Sandbox Code Playgroud)

如果你需要剥离领先0b:

>>> c.bin[2:]
'11111111'
Run Code Online (Sandbox Code Playgroud)

bitstring正如jcollado的回答所示,该模块不是必需的,但它有许多高性能的方法可以将输入转换为位并操纵它们.您可能会发现这个方便(或不),例如:

>>> c.uint
255
>>> c.invert()
>>> c.bin[2:]
'00000000'
Run Code Online (Sandbox Code Playgroud)

等等

  • +1。对于最新版本的位串(3.0),您无需去除开头的“ 0b”。 (2认同)

Ano*_*sse 22

在整数级别工作时,操作会快得多.特别是,转换为此处建议的字符串非常慢.

如果您只想要第7位和第8位,请使用eg

val = (byte >> 6) & 3
Run Code Online (Sandbox Code Playgroud)

(这是:将字节向右移6位 - 丢弃它们.然后只保留最后两位3是设置前两位的数字......)

这些可以很容易地转换为超快速的简单CPU操作.


jco*_*ado 18

这样的事情怎么样?

>>> bin(int('ff', base=16))
'0b11111111'
Run Code Online (Sandbox Code Playgroud)

这会将您拥有的十六进制字符串转换为整数,并将该整数转换为每个字节设置为0/1的字符串,具体取决于整数的位值.

正如评论所指出的,如果你需要摆脱0b前缀,你可以这样做:

>>> bin(int('ff', base=16)).lstrip('0b')
'11111111'
Run Code Online (Sandbox Code Playgroud)

或者这样:

>>> bin(int('ff', base=16))[2:]
'11111111'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`lstrip('0b')`也将删除,例如,`00bb`,因为`lstrip`的参数是要删除的*set*字符.在这种情况下它会正常工作,但我更喜欢`[2:]`解决方案,因为它更明确. (5认同)

Fer*_*uzz 8

二进制:

bin(byte)[2:].zfill(8)
Run Code Online (Sandbox Code Playgroud)

  • 您不能使用bin转换字节。 (3认同)

Mik*_*l V 7

我认为最简单的就是在numpy这里使用。例如,您可以将文件作为字节读取,然后像这样轻松地将其扩展为位:

Bytes = numpy.fromfile(filename, dtype = "uint8")
Bits = numpy.unpackbits(Bytes)
Run Code Online (Sandbox Code Playgroud)


AJP*_*AJP 6

input_str = "ABC"
[bin(byte) for byte in bytes(input_str, "utf-8")]
Run Code Online (Sandbox Code Playgroud)

会给:

['0b1000001', '0b1000010', '0b1000011']
Run Code Online (Sandbox Code Playgroud)


Jon*_*ale 5

这里如何使用 format()

print "bin_signedDate : ", ''.join(format(x, '08b') for x in bytevector)
Run Code Online (Sandbox Code Playgroud)

08b很重要。这意味着最多将附加 8 个前导零来完成一个字节。如果您不指定这一点,那么格式将只为每个转换后的字节提供可变的位长度。


Zen*_*odr 5

使用python 格式字符串语法

>>> mybyte = bytes.fromhex("0F") # create my byte using a hex string
>>> binary_string = "{:08b}".format(int(mybyte.hex(),16))
>>> print(binary_string)
00001111
Run Code Online (Sandbox Code Playgroud)

第二行是魔术发生的地方。所有字节对象都有一个.hex()函数,该函数返回一个十六进制字符串。使用此十六进制字符串,我们将其转换为整数,告诉该int()函数它是以16为基数的字符串(因为hex是以16为基数)。然后,我们将格式化应用于该整数,以使其显示为二进制字符串。该{:08b}是真正的奇迹发生。它使用的是Format Specification Mini-Language format_spec。具体来说,它使用format_spec语法的widthtype部分。该8width到8,这是我们如何得到很好的填充0000,和b集类型为二进制。

bin()方法相比,我更喜欢此方法,因为使用格式字符串可提供更大的灵活性。