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

Python中的二进制到字符串/文本,python,python-2.7,python-3.x,text,binary,Python,Python 2.7,Python 3.x,Text,Binary,我在网上搜索了很多次,但都没有找到转换二进制字符串变量X 转换为UTF-8字符串值 我发现有些人正在使用诸如 b'message'.decode('utf-8') 然而,这种方法对我来说并不适用,因为据说“b”不存在,我不知道如何用变量替换“message”。不仅如此,我还无法理解这种方法是如何工作的。有更好的选择吗 那么如何将二进制字符串转换为文本字符串呢 编辑:我也不介意ASCII解码 澄清:以下是我特别希望发生的事情 def binaryToText(z): # Some cod

我在网上搜索了很多次,但都没有找到转换二进制字符串变量X

转换为UTF-8字符串值

我发现有些人正在使用诸如

b'message'.decode('utf-8')
然而,这种方法对我来说并不适用,因为据说“b”不存在,我不知道如何用变量替换“message”。不仅如此,我还无法理解这种方法是如何工作的。有更好的选择吗

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

编辑:我也不介意ASCII解码

澄清:以下是我特别希望发生的事情

def binaryToText(z):
    # Some code to convert binary to text
    return (something here);
X="0110100001101001"
print binaryToText(X)
这将产生字符串

hi

int
提供可选的基本参数以进行转换:

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

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

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

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

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

您可以获取每一块8个字符(一个字节),将其转换为整数,然后使用
chr()
将其转换为字符:

假设字符串中编码的值是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):


要将作为“01”-字符串(二进制数字)给出的位转换为Python 3中的相应文本,请执行以下操作:

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

对于Python 2/3解决方案,请参见。

因为ASCII实际上是UTF-8的子集,所以您会发现字符串
X
已经是UTF8字符串。您的预期输出是什么?+mhawke我正在寻找UTF-8字符串的返回值。二进制文件最初是一个字符串,我希望能够将该二进制文件转换为UTF-8字符串。如果你需要更多的澄清,请问我!您使用的是Python2还是Python3?你为什么给这两个都贴标签?在Python3中,字符串默认为utf。+juanpa.arrivillaga我可以灵活地同时使用这两者,具体取决于我最适合使用哪个选项。我可以接受这两个版本的解决方案。好吧,如果你使用Python 3,所有字符串都是unicode,所以这似乎是最简单的解决方案…那么我如何解码X呢?X.decode()似乎不起作用。您是否也可以添加反向代码?用于将字符串转换为二进制。那太好了:)@Dan:
'.join([bin(ord(c))[2:].rjust(8,'0')for c in'hi'])
我很晚才找到这个解决方案,但我很好奇。当我运行上面最后一段代码时,我得到
“str”对象没有属性“decode”
。我之所以提出这个问题,是因为这个解决方案似乎非常适合我的需要,但编码(或者说解码)部分似乎不起作用。
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
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)
>>> bits = "0110100001101001"
>>> n = int(bits, 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hi'