【问题标题】:text - binary conversion文本 - 二进制转换
【发布时间】:2015-01-13 08:52:37
【问题描述】:

我正在尝试制作一个将文本转换为一个长二进制字符串的 python 程序。通常的测试和句子行很容易转换为二进制,但我遇到了空格问题。
如何输入一个二进制字节来表示回车键?

我只输入'/'和'n'字符串吗?

理想情况下,我希望能够将整个文本文件转换为二进制字符串并能够再次将其转换回来。显然,如果我使用 python 脚本来执行此操作,则选项卡会变得混乱,并且程序会被破坏。

C 语言会更适合做这些事情吗?

显然,C 程序在没有空格的情况下仍然可以运行,而 python 则不会。

简而言之,我需要知道如何用二进制表示“tab”和“enter”键,以及如何创建一个函数将它们转换为二进制。 bin(ord('\n')) 会好吗?

【问题讨论】:

  • 请澄清“一个长二进制字符串”。你的意思是一堆“1”和“0”字符,它们之间没有空格吗?要快速估算大小,请取文本中的字符数,然后乘以 8,即可得出二进制字符串的大小。
  • 既然您似乎在谈论 ASCII,为什么不查找 Tab 和 Enter 的值?
  • 由于您正在从一个文件转换到另一个文件,因此您不需要关心 Python 对字符的文字表示。像往常一样,展示您在问题中所做的工作是个好主意。

标签: python c++ c binary


【解决方案1】:

选项卡在 ASCII 图表中表示为 0x08 0x09,或二进制字符串中的 "00001000" "00001001"。

Enter 键不同,因为它可以表示 CR(回车)、LF(换行)或两者。

CR 表示为 0x0d,或“00001101”为二进制字符串。 LF 表示为 0x0A,或“00001010”为二进制字符串。

一个常见的约定是 '\t' 代表制表符,'\r' 代表 CR,'\n' 代表换行符。

【讨论】:

  • 通用约定可能适用于 OP,但这需要另一个通用约定:加倍反斜杠来表示一个。
【解决方案2】:

一个简单的呢:

def text_to_bits(text):
    bytes = text.encode('utf8')
    bits = [bin(ord(c))[2:].zfill(8) for c in bytes]
    return ''.join(bits)

这将完全使用text 中的字节(一旦编码为utf8 - 如果text 以ASCII 开头,这将是无害的,但如果它是Unicode 则必不可少!-)所以没有约定或其他安排需要 - 你会得到一个字符串 0s 和 1s,每字节 8 位。

正如@gnibbler 的评论正确指出的那样,如果text 有数百个字符长,查找表会更快,例如,用两行替换之前的bits =

lookup = {c: bin(c))[2:].zfill(8) for c in range(256)}
bits = [lookup[ord(c)] for c in bytes]

或者,lookup 也可以是一个列表:

lookup = [bin(c))[2:].zfill(8) for c in range(256)]

所有这些都应该相同,选择最适合您的速度和清晰度的组合!-)

【讨论】:

  • 如果文本很多,您可以使用查找列表来加快速度。例如。 A = [format(c, "08b") for c in range(256)] 然后[A[c] for c in bytes]
  • 很好的建议,编辑了 A 以引入查找替代方法(以及我们都忘记的 ord:-)。 formatbin + zfill 是否更快(同上,list vs dict 用于查找表)需要使用-mtimeit 进行微基准测试,尽管我认为您的format 想法确实具有更高的可读性。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多