python怎么输出二进制字符串,python二进制字符串到二进制d

本文详细介绍了如何使用Python的struct模块处理二进制数据,包括将字符串转换为二进制表示,利用struct.pack打包数据为特定格式,以及struct.unpack进行解码。通过实例展示了如何编码字符和数字,以及不同格式字符串在处理字节和字符上的应用。
摘要由CSDN通过智能技术生成

import struct

with open("foo.bin", 'wb') as f:

f.write(struct.pack('h', 0b0010010110101))

将采用2个字节(16位)作为短整数(h)。您可以使用struct module来定义自己的格式字符串,但我不确定您是否能够使用字节大小。在

编辑

根据你的评论,以下是一些背景:

在文件中写入内容时,总是将其转换为二进制文件。字符是用某种规则编码的,称为编码(如ASCII),其中每个字符都映射到一个数字,这个数字本身用二进制表示。这样,数字00100100(36)和字符“$”是相同的$'在文件中由36表示,您之间的软件层(如编辑器)将以字符“$”呈现它遇到的每个“00100100”。在

现在,当您将字符串“00100100”写入文件时,它将打印字符“0”、“1”等。。。。因此,字符串“00100100”由二进制数11000011000011100011000011000111000011000110000表示。这是必要的,因为输入是字符串,您需要一种明确的方法来表示所有可能的8个字符长的字符串,而不仅仅是表示0和1的字符串

用于编写文件的Python API总是在写字符串,也就是说,它将自动执行这个转换字符串->二进制数,我不知道有什么方法可以覆盖它。但是,您可以生成字符串,这样它的二进制表示就是您想要编写的实际二进制字符串:如果您想将数字00100100写入一个文件,您可以只写f.write('$'),这实际上是同一件事。在

这正是“struct”模块所执行的操作:它生成一个字节或字符字符串,与您提供给它们的数字完全匹配。在

在我的示例中,我给它一个数字0b0010010110101,并告诉它将其编码为short整数,即在两个字节上。如果在Python解释器中执行struct.pack('h', 1205),它将打印出与“byte base”中的这个数字相对应的两个字符(字节)\xb5\x04,即以256为基数(使用big-endian约定)。事实上:

^{pr2}$

就像你可以用10为基数(如36)、以16为基数(如0x24)、以2为基数(如0b100100)表示任何十进制数字一样,也可以通过ASCII编码(例如“$”)以256为基数表示它。Struct确实做到了这一点,还为您正在编写的数据类型提供了一个方便的“fmt”字符串约定。也可以直接将每个字节转换为相应的字符:def encode(binary):

# Aligning on bytes

binary = '0' * (8 - len(binary) % 8) + binary

# Generating the corresponding character for each

# byte encountered

return ''.join(chr(int('0b' + binary[i:i+8], base = 2))

for i in xrange(0, len(binary), 8))

这是一种非常粗糙且效率不高的处理方法,但它确实会将每个字节转换为相应的字符,并返回相应的字符串,您可以直接将其写入文件:>>> encode('001001001010100100100100100111110010101110100')

'\x04\x95$\x93\xe5t'

事实上,写入文件会产生6个字节,对应于6个字符:with open("foo.bin", 'wb') as f:

f.write('\x04\x95$\x93\xe5t')

>>> os.path.getsize("foo.bin")

6L

struct模块执行完全相同的操作,除了使用固定格式,并且以更高效的方式执行。不是得到与整数相对应的chrdef encode2(binary):

rawbytes = []

while binary > 0:

binary, byte = divmod(binary, 256)

rawbytes.append(byte)

fmt_string = '%sB' % len(rawbytes)

print "Encoding %s into %s bytes (%s)" % (rawbytes, len(rawbytes), fmt_string)

return struct.pack(fmt_string, *rawbytes)

>>> encode2(0b001001001010100100100100100111110010101110100)

Encoding [116L, 229L, 147L, 36L, 149L, 4L] into 6 bytes (6B)

't\xe5\x93$\x95\x04'

(请注意,这些字符与encode中输出的字符相同。唯一的区别是顺序,这取决于转换的结束性)。在

然后还可以使用struct和相同的格式字符串对这些字符进行解码:>>> bytes = struct.unpack('6B', 't\xe5\x93$\x95\x04')

>>> bytes

(116, 229, 147, 36, 149, 4)

>>> bin(sum(x * 256 ** i for i, x in enumerate(bytes)))

'0b1001001010100100100100100111110010101110100'

这是我们原来的号码。在

底线是:Python文件API只能处理字符,这些字符实际上是字节。可能有一些神奇的方法可以将单个位写入文件,但我不会太指望它,因为这会带来自身的问题,字节在99%的情况下都是足够的。要写入二进制数据,请以256为基数表示它,并将其b256位数字转换为相应的字符。根据定义,这个字符串的二进制表示是原始数字。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值