【问题标题】:Python convert strings of bytes to byte arrayPython将字节字符串转换为字节数组
【发布时间】:2020-12-28 19:57:50
【问题描述】:

例如给定一个任意字符串。可以是chars 或只是随机的bytes

string = '\xf0\x9f\xa4\xb1'

我要输出:

b'\xf0\x9f\xa4\xb1'

这看起来很简单,但我在任何地方都找不到答案。当然,只需键入b 后跟字符串即可。但我想做这个运行时,或者从一个包含字节字符串的变量中。

如果给定的stringAAAA 或一些已知的characters,我可以简单地做string.encode('utf-8'),但我希望字节串只是随机的。对'\xf0\x9f\xa4\xb1'(随机字节)这样做会产生意想不到的结果b'\xc3\xb0\xc2\x9f\xc2\xa4\xc2\xb1'

一定有更简单的方法吗?

编辑:

我想在不使用编码的情况下将字符串转换为字节

【问题讨论】:

  • 是否要将字符串转换为字节?目前尚不清楚所需的解决方案是什么......如果您知道它是一个没有 b 的字节字符串,您可以进行一些字符串格式化。如果您需要以字节为单位,您可以致电bytes(string)。这有帮助吗:stackoverflow.com/questions/606191/convert-bytes-to-a-string ?
  • 是的,我想简单地将字符串转换为字节
  • 好的,我看到了你的问题。您可能需要使用原始字符串
  • bytes 函数接受stringencoding。由于我期望的字节是随机的,我不想为它选择编码

标签: python character-encoding


【解决方案1】:

Latin-1 字符编码很简单(与 Python 支持的所有其他编码不同)将 0x00-0xff 范围内的每个代码点编码为具有相同值的字节。

byteobj = '\xf0\x9f\xa4\xb1'.encode('latin-1')

你说你不想使用编码,但避免它的替代方案似乎远不如。

UTF-8 编码不合适,因为正如您已经发现的那样,高于 0x7f 的代码点映射到多个字节(最多四个字节)的序列,这些都不是作为字节值的输入代码点。

省略.encode() 的参数(如现在已删除的答案中)会强制 Python 猜测编码,这会产生依赖于系统的行为(可能在除 Windows 之外的大多数系统上选择 UTF-8,它通常会选择更不可预测的事情,通常也更险恶和可怕)。

【讨论】:

    【解决方案2】:

    我找到了一个可行的解决方案

    import struct
    
    def convert_string_to_bytes(string):
        bytes = b''
        for i in string:
            bytes += struct.pack("B", ord(i))
        return bytes       
    

    string = '\xf0\x9f\xa4\xb1'

    print (convert_string_to_bytes(string)))

    输出: b'\xf0\x9f\xa4\xb1'

    【讨论】:

    • b'\'\\x1e\\x03\\xcd\\xb6\\x93:\\x87\\xfc\\xcfp\\xfc\\xb7\\xba\\x8a\ \x0es\\x81P\\xe1\\x1b\\n4a\\xe4"\\xdfA\\x8e\\x8a\\x15\\x18\\xb8\\x12\\xfcB/\\xea\\x83\ \xd4\\x1dd\\xb8\\x14\\xd3\\xb9\\xfa\\x97B\\xfe\\x89\\xe1\\xff\\xbe\\x02\\xedY\\xc9pk\\\ '\\xf8\\x1d9\\x1a\'' 输出是这样的
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多