将字符串字节转换为字节数组的Python方法

5
例如,给定任意字符串。可以是字符或随机的字节
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)。这个帮助吗:https://dev59.com/OXRB5IYBdhLWcg3wgHWr? - Scott Skiles
是的,我想简单地将字符串转换为字节。 - AznBoyStride
好的,我明白你的问题了。你可能需要使用原始字符串。 - Scott Skiles
bytes 函数接受一个 string 和一个 encoding。由于我期望的字节是随机的,所以我不想为它选择一个编码。 - AznBoyStride
2个回答

5

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

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

你说你不想使用编码,但避免使用编码的其他选择似乎要差得多。
UTF-8编码不适用,因为正如你已经发现的那样,大于0x7f的码点映射到多个字节序列(最多四个字节),其中没有任何一个是与输入码点完全相同的字节值。
省略 .encode() 的参数(如已删除的答案中所示)会强制 Python 猜测编码,这会产生系统相关行为(在大多数系统上可能会选择 UTF-8,但在 Windows 上通常会选择更加不可预测、更加险恶和可怕的东西)。

3
我找到了一个可行的解决方案。
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'' 需要翻译的内容是这样的 - Sadique Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接