Python中的二进制到字符串/文本

Posted

技术标签:

【中文标题】Python中的二进制到字符串/文本【英文标题】:Binary to String/Text in Python 【发布时间】:2017-03-26 05:40:16 【问题描述】:

我在网上搜索了很多次,一直没能找到转换我的二进制字符串变量的方法,X

X = "1000100100010110001101000001101010110011001010100"

转换成 UTF-8 字符串值。

我发现有些人在使用诸如

之类的方法
b'message'.decode('utf-8')

但是,这种方法对我不起作用,因为据说“b”不存在,而且我不确定如何用变量替换“消息”。不仅如此,我还无法理解这种方法是如何工作的。有更好的选择吗?

那么如何将二进制字符串转换为文本字符串呢?

编辑:我也不介意 ASCII 解码

澄清:这就是我特别希望发生的事情。

def binaryToText(z):
    # Some code to convert binary to text
    return (something here);
X="0110100001101001"
print binaryToText(X)

这将产生字符串...

hi

【问题讨论】:

由于 ASCII 实际上是 UTF-8 的一个子集,您会发现您的字符串 X 已经是一个 UTF8 字符串。您的预期输出是什么? +mhawke 我正在寻找一个 UTF-8 字符串的返回值。二进制文件最初是一个字符串,我希望能够将该二进制文件转换为 UTF-8 字符串。如果您需要更多说明,请询问我! 您使用的是 Python 2 还是 Python 3?你为什么同时标记两者?在 Python 3 中,字符串默认为 utf。 +juanpa.arrivillaga 我可以灵活地使用这两种方法,这取决于哪个选项最适合我使用。我可以接受这两个版本的解决方案。 好吧,如果你使用 Python 3,所有字符串都是 unicode,所以这似乎是最直接的解决方案... 【参考方案1】:

您似乎正在尝试从每个字符的二进制字符串表示(位字符串)中解码 ASCII 字符。

您可以获取每个包含八个字符(一个字节)的块,将其转换为整数,然后将其转换为带有chr() 的字符:

>>> X = "0110100001101001"
>>> print(chr(int(X[:8], 2)))
h
>>> print(chr(int(X[8:], 2)))
i

假设字符串中编码的值是 ASCII,这将为您提供字符。你可以这样概括:

def decode_binary_string(s):
    return ''.join(chr(int(s[i*8:i*8+8],2)) for i in range(len(s)//8))

>>> decode_binary_string(X)
hi

如果您想将其保留为原始编码,则无需进一步解码。通常你会将传入的字符串转换为 Python unicode 字符串,这可以像这样(Python 2)完成:

def decode_binary_string(s, encoding='UTF-8'):
    byte_string = ''.join(chr(int(s[i*8:i*8+8],2)) for i in range(len(s)//8))
    return byte_string.decode(encoding)

【讨论】:

你也可以添加反向代码吗?用于将字符串转换为二进制。那太好了:) @Dan: ''.join([bin(ord(c))[2:].rjust(8,'0') for c in 'hi']) 我已经很晚了,但我很好奇。当我运行上面的最后一个代码 sn-ps 时,我得到'str' object has no attribute 'decode'。我提出这个问题是因为这个解决方案看起来很适合我的需要,但是编码(或者更确切地说是解码)部分似乎不起作用。【参考方案2】:

将作为“01”字符串(二进制数字)给出的位转换为 Python 3 中的相应文本:

>>> bits = "0110100001101001"
>>> n = int(bits, 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hi'

对于 Python 2/3 解决方案,请参阅Convert binary to ASCII and vice versa。

【讨论】:

【参考方案3】:

在 Python 2 中,ascii 编码(字节)字符串也是 utf8 编码(字节)字符串。 在 Python 3 中,(unicode)字符串必须编码为 utf8 编码的字节。解码示例走错路了。

>>> X = "1000100100010110001101000001101010110011001010100"
>>> X.encode()
b'1000100100010110001101000001101010110011001010100'

仅包含数字“0”和“1”的字符串是一种特殊情况,适用相同的规则。

【讨论】:

那么我如何解码 X 呢? X.decode() 似乎不起作用。【参考方案4】:

将可选的基​​本参数提供给int 进行转换:

>> x = "1000100100010110001101000001101010110011001010100"
>> int(x, 2)
301456912901716

【讨论】:

以上是关于Python中的二进制到字符串/文本的主要内容,如果未能解决你的问题,请参考以下文章

python re模块替换文本文件中的二进制数据?

Python中的字符串

python怎么提取出文件里的指定内容

python3中的编码

使用 .NET 2.0 将逗号添加到文本字符串中的十进制数

python3中的unicode_escape