2015-01-12 95 views
0

我试图做一个Python程序,将文本转换为一个长的二进制字符串。通常的测试和句子行很容易转换成二进制文件,但我遇到了空白问题。
如何放入二进制字节来表示回车键?文本 - 二进制转换

我只是放在'/'和'n'字符串?

我希望能够将整个文本文件转换为二进制字符串并能够再次将其转换回来。很显然,如果我要用python脚本来做到这一点,那么Tab键就会搞砸了,程序就会被破坏。

C语言会做这个东西更好吗?

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

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

+0

请说明“一长串二进制串”。你的意思是一堆'1'和'0'字符之间没有空格吗?要获得快速的大小估计,请取文本中的字符数,然后乘以8,这会给出二进制字符串的大小。 –

+0

由于您似乎谈论ASCII,为什么不查找Tab和Enter的值? – usr2564301

+0

由于您正在将文件从一个文件转换为另一个文件,因此您不必关心Python中字符的文字表示。像往常一样,这是一个好主意,以显示你在你的问题上工作的部分。 –

回答

0

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

回车键不同,因为它可能代表CR(回车),LF(换行符)或两者。

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

一个常见的约定是对于制表符的'\ t'和对于换行符的'\ n'的'\ r'。

+0

公共约定可能适用于OP,但这需要另一个常见约定:将反斜杠加倍以表示一个约定。 – usr2564301

0

什么简单:

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的 - ! ),所以不需要任何约定或其他安排 - 您将得到一串0 s和1 s,每字节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)] 

所有这些都应该工作一样,挑选速度和清晰度最适合您的组合 - )

+1

如果有很多文本,可以使用查找列表使其更快。例如。 'A = [范围(c,“08b”),范围为(256)],然后是[A [c]为c,以字节为单位]' –

+0

好建议,编辑A引入查找替代方法'ord'我们都忘记了:-)。我认为'format'或'bin + zfill'是否更快(查找表的ditto,list vs dict)需要用-mtimeit进行微基准化,尽管你的'format'想法**可以享受更多的可读性。 –