【问题标题】:how to decode following bytes in Python 3如何在 Python 3 中解码以下字节
【发布时间】:2018-05-24 06:56:47
【问题描述】:

在 Python 3 中,使用 socket.recv() 从硬件获取数据,并获取字节:b'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'

如何将上述内容解码为 str(或 unicode)'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'?尝试了“ascii”、“latin-1”、“utf-8”。没有任何作用。

在 Python 2.7 中,b'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'.decode('latin-1') 有效,并获得 unicode u'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'。 ascii, utf-8 也不行。

附言我正在将 Python 2.7 代码转换为 Python 3.6

【问题讨论】:

  • b'\x00...'.decode('latin-1') 为我工作并提供所需的输出。 Latin-1 总是“有效”解码字节序列,因为一个字节的所有 256 种可能状态都可以由 Latin-1 解释。它在哪些方面对您不起作用?
  • 它在 python 3.6 中有效吗?我得到了 '\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) current set to 0.008.ü©ñÒMb\x80?',在 0.008 之后都搞砸了
  • 不,是一样的。检查'\xfc\xa9\xf1\xd2Mb\x80?' == 'ü©ñÒMb\x80?'的输出
  • 谢谢@lenz,为什么它显示的如此不同?
  • 您可以插入任何带有反斜杠符号的字符,例如。 '\x41' == 'A'。在repr() 表单中,不可打印的字符(控制字符和大多数空格)以反斜杠转义显示——就像你看到的'\n',但字符串包含一个实际的换行符,而不是“\”和“n”。在 Python 2 中,高于 127 的代码点(如“ü”)被视为不可打印;这已在 Python 3 中被删除,这就是您在此处看到的区别。

标签: string python-3.x unicode


【解决方案1】:

您需要什么信息?因为如果你只需要这部分:

The Delta Wavelength (nm) is currently set to 0.008.

然后你可以这样做:

data = socket.recv()[8:60].decode("utf-8")

或使用 memoryview 更快

data = memoryview(socket.recv())[8:60].decode("utf-8")

我假设您不需要硬件的元数据

【讨论】:

  • python 2.7 代码将字节分成 3 部分:header('\x00\x004\x00\x08\x00\x00\x00'),message('The Delta Wavelength (nm) is current设置为 0.008.') 和 content('\xfc\xa9\xf1\xd2Mb\x80?')。
  • @Zheng 那么也许您也应该将分割部分代码移植到 Python 3 中?
  • 是的,然后 unpack('d', content)[0] 获取值并传递它。
猜你喜欢
  • 2021-06-13
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多