【问题标题】:How do I decode radar data read by Python/socket like b'\x08\x00\x00\x00' to numbers如何将 Python/socket 读取的雷达数据(如 b'\x08\x00\x00\x00' 解码为数字
【发布时间】:2019-09-25 23:51:30
【问题描述】:

我正在开发一个 Python3 程序来处理来自雷达的数据。一般来说,雷达将数据(十六进制数字)发送到我电脑的一个端口,我使用套接字来监听那个端口。并使用下面的代码来接收 4 个字节的数据。

data = connection.recv(4)
print(data)

在测试我的程序时,雷达发送08 00 00 01 和程序打印b'\x08\x00\x00\x01'。我理解 '\x' 意味着字符旁边是一个十六进制数字,但我想从中获取像 [08, 00, 00, 01] 这样的数字或普通字符串。尝试了最明显的方法:

strData = data.decode()
print(strData.split('\x'))

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \xXX escape 失败。

如果雷达发送08 0D 00 00print(data) 将打印b'\x08\r\x00\x00',情况会变得更糟,这让我意识到字符串操作无法处理这个问题。

那么,将b'\x08\x00\x00\x01' 之类的字节转换为08 00 00 01 之类的数字的正确方法是什么。

字符串编码让我发狂 -.- 虽然我使用的是 Python3,但 Python2.7 中的解决方案也可以。提前致谢。

【问题讨论】:

  • 您想要整数8, ...、2 个字符的十六进制字符串"08", ...,还是只需要整数,即134217729

标签: python arrays string hex


【解决方案1】:

我猜你已经得到了二进制数据。如果您真的想要将十六进制表示作为字符串,Answer to similar question 可以帮助您。

如果您想将数据解释为例如浮点数,可以使用结构

import struct
x = struct.unpack('f',data)

【讨论】:

    【解决方案2】:

    对于这种特定情况 - 您有一个字节串,并且您希望将每个字节转换为其等效整数 - 您可以将字节串直接转换为列表。

    >>> bs = b'\x08\x00\x00\x01'
    >>> ints = list(bs)
    >>> ints
    [8, 0, 0, 1]
    

    这是因为

    字节对象实际上表现得像不可变的整数序列

    所以

    [For] 一个字节对象 b,b[0] 将是一个整数,而 b[0:1] 将是一个长度为 1 的字节对象。(这与文本字符串形成对比,其中索引和切片都会产生长度为 1) 的字符串

    docs 引用 bytes 类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-07-09
      • 2023-04-07
      相关资源
      最近更新 更多