代码之家  ›  专栏  ›  技术社区  ›  E. Erfan

如何在python中将二进制内容解码为原始字符串内容?

  •  0
  • E. Erfan  · 技术社区  · 5 年前

    我有一个字符串需要编码成二进制。我得到一个像“11010011100…”这样的值字符串非常重要,因为稍后我需要将其插入灰度图像的最低像素位。(基本上,我是在图像中隐藏信息。)我在windows 10上,使用python 3.6.8。

    接下来 link 我写了这个方法来编码它:

    def message2bin(msg):
        """
        Converts a msg to binary format
        :param msg: message to convert
        :return: binary content of message in string format
        """
        message_bin = ''.join(format(x, 'b') for x in bytearray(msg, 'utf-8'))
        return message_bin
    
    msg = 'Hello world'
    print(message2bin(msg)) 
    

    输出为:100100011001011101100110110011011111000001111111111111011011001100100

    现在我想有一个方法来获取这个二进制流,并使原始消息如下:

    bin2message(message2bin(msg))
    >> Hello world
    

    我尝试了以下方法:

    print(bytearray(message2bin(msg), 'utf-8').decode(encoding))
    

    但结果又是:

    >> 1001000110010111011001101100110111110000011101111101111111001011011001100100
    

    我也不明白为什么二进制消息的长度是76而不是78?首先,它把每个字符分成7位,而不是8位,我不明白为什么。而且,即使有7位,“Hello world”也有11个字符,所以我预计长度为77,但它给了我76?谁能给我解释一下吗?

    print(len(message2bin(msg)))
    >> 76
    

    感谢大家的宝贵意见。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Henry Tjhia    5 年前
    def msgencoder(msg):
        return format(int(bytes(msg, 'utf-8').hex(), base=16), 'b')
    
    def msgdecoder(msg):
        return bytes.fromhex(format(int(msg, base=2), 'x')).decode('utf-8')
    
    a = msgencoder('hello world')
    b = msgdecoder(a)
    
    print(b)
    
    hello world