【问题标题】:Python3 write string as binaryPython3将字符串写入二进制
【发布时间】:2013-11-17 23:10:39
【问题描述】:

对于 Python 3 编程任务,我必须使用 Huffman 编码。生成正确的代码很简单,这会导致一长串 0 和 1。

现在我的问题实际上是将此字符串写入二进制而不是文本。我试图这样做:

result = "01010101 ... " #really long string of 0's and 1's
filewrt = open(output_file, "wb") #appending b to w should write as binary, should it not?
filewrt.write(result)
filewrt.close()

但是我仍然得到一个 0 和 1 个字符的大文本文件。我该如何解决这个问题?

编辑:似乎我只是不明白如何在 Python 3 中表示任意位。

基于this SO question我设计了这个丑陋的怪物:

for char in result: 
    filewrt.write( bytes(int(char, 2)) )

它没有接近工作,而是输出了一个零文件,该文件是我的输入文件的两倍。有人可以向我解释如何任意表示二进制吗?在创建霍夫曼树的上下文中,如果我不应该使用字符串来连接或连接位,我该如何根据叶位置来连接或连接位。

【问题讨论】:

  • result 是一个 Unicode 字符串,恰好包含 01。将其写入二进制输出流是类型错误。你确定你没有在 Python 2 下运行它吗?
  • 您需要先将零和一转换回字节; Python 不会为你做这些。
  • @Mechanicalsnail 非常确定。我在 aptana 中明确定义了 Python3,这学期我一直在使用它,所以希望我是。
  • @MartijnPieters 我明白了。它需要一个特定的“字节”对象还是“字节数组”?我需要手动将这个字符串转换成什么类型​​的实例?
  • bytes 类型用于表示任意字节数组。这可能是一个字符串,在这种情况下,.decode() 会将其解码为一个 unicode 字符串,或者只是其他任何东西。在任何情况下,您都可以使用二进制操作对其进行操作,并使用索引访问单个字节。如果要将结构存储为二进制对象(例如树节点),还可以使用pickle 进行bytes 和 Python 对象之间的转换。

标签: python-3.x huffman-code


【解决方案1】:
def intToTextBytes(n, stLen=0):
    bs = b''
    while n>0:
        bs = bytes([n & 0xff]) + bs
        n >>= 8
    return bs.rjust(stLen, b'\x00')


num = 0b01010101111111111111110000000000000011111111111111
bs = intToTextBytes(num)
print(bs)
open(output_file, "wb").write(bs)

编辑:一种更复杂但更快(大约 3 倍)的方式:

from math import log, ceil
intToTextBytes = lambda n, stLen=0: bytes([
    (n >> (i<<3)) & 0xff for i in range(int(ceil(log(n, 256)))-1, -1, -1)
]).rjust(stLen, b'\x00')

【讨论】:

  • 我实际上不能将它用于我的作业(抄袭等),但这绝对是我将在我自己的项目中使用的东西。谢谢!
  • 您可以在任何地方使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2016-01-15
  • 2021-10-27
  • 2012-09-22
  • 2016-10-03
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多