【问题标题】:Python 3 - Converting byte string to string with same contentPython 3 - 将字节字符串转换为具有相同内容的字符串
【发布时间】:2023-03-11 05:27:02
【问题描述】:

我正在将项目代码从 Python 2 迁移到 Python 3。 一段代码正在使用 struct.pack 它为我提供字符串(Python2)和字节字符串(Python3)中的值 我想将 python3 中的字节字符串转换为普通字符串。转换后的字符串应具有相同的内容,以使其与现有值一致。 例如

in_val = b'\0x01\0x36\0xff\0x27' # Input value
out_val = '\0x01\0x36\0xff\0x27' # Output should be this

我有一种解决方案可以将 in_val 转换为字符串,然后显式删除 'b' 和 '\' 字符,这些字符将在转换为字符串后出现。

是否有任何其他解决方案可以使用干净的方式进行转换。 任何帮助表示赞赏

【问题讨论】:

  • 为什么需要这样做? Python 2 str 一个字节串。您确定代码的其余部分必须将struct.unpack 结果视为文本吗?

标签: python python-3.x byte python-2.x


【解决方案1】:

str 值始终是 Unicode 代码点。前 256 个值是 Latin-1 范围,因此您可以使用该编解码器将字节直接解码为这些代码点:

out_val = in_val.decode('latin1')

但是,您想重新评估您这样做的原因。不要将二进制数据存储在字符串中,几乎总是有更好的方法来处理二进制数据。例如,如果您想以 JSON 格式存储二进制数据,那么您需要使用 Base64 或其他一些能够更好地处理边缘情况的二进制到文本编码方案,例如在解释为文本时包含转义码的二进制数据。

【讨论】:

  • 嗨 Martijn,感谢您的评论。我们需要这样做,因为我们正在将完整的项目从 Python 2 移动到 3,如前所述。很难更改大部分代码,因为这需要大量的测试工作。因此,我们正在寻找一些能够完美模仿 Python3 中 Python 2 操作输出的解决方案。我正在尝试使用“latin-1”编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2019-10-10
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多