【问题标题】:Converting Bytes to float format将字节转换为浮点格式
【发布时间】:2021-08-09 01:50:01
【问题描述】:

我从 UDP 套接字接收的数据报消息中得到以下数据:

b'/13/raw\x00,ffffffffffffff\x00=\xca\x00\x00=[\x00\x00\xbf\x82H\x00B\x14\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B;\x81\n\xbf\xbat4C-\xfd\xb0B\x87\xac\xd9\x00\x00\x00\x00E\xcd\xc0\x00I\xcc\xc1\xe0'

这是我的代码:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((IP, p))
print("Listening for UDP packets on {0}:{1} ...".format(IP, p))
while 1:
    rawdata, _ = sock.recvfrom(1024)
    print(rawdata)

如何将原始数据转换为浮点数?

这是我期望的数据类型:

两者都是不同的样本!

谢谢

【问题讨论】:

  • 你需要知道数据代表什么以及你期望什么......然后你通常使用类似struct.unpack的东西
  • 数据无法代表您所期望的内容
  • 谢谢,我添加了这些信息。我期待花车@JoranBeasley
  • 请不要对文字使用屏幕截图...
  • 您确定预期的数据与特定的字节串匹配还是一般预期的输出?

标签: python python-3.x sockets udp


【解决方案1】:

每个浮点数是 4 个字节的数据(通常...并非总是...再次,您需要查阅文档以获取所需的任何 p[ayload)

但假设/13/raw 对您来说足够简单,剩下的就是您需要解码的内容

如果我们假设\x00 是某种分隔符,我们将得到如下的字节串

msgBytes = b',ffffffffffffff\x00=\xca\x00\x00=[\x00\x00\xbf\x82H\x00B\x14\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B;\x81\n\xbf\xbat4C-\xfd\xb0B\x87\xac\xd9\x00\x00\x00\x00E\xcd\xc0\x00I\xcc\xc1\xe0'

我们可以看到有 72 个字符,这意味着 18 个浮点数 (18*4 === 72)

但是您的预期输出似乎只有 14 个浮点数,这意味着 16 个字节是某种元数据(可能是校验和,或一些有效负载信息(预期有多少个浮点数))

我们现在可以将其解包为浮点数...但我没有得到您的“预期值” 所以其中一些可能是双精度数或 4 字节浮点数以外的东西

floats = struct.unpack('18f',msgBytes)

现在您有一个包含 18 个浮点数的列表...但再次与您的预期输出不匹配,它可能与字节顺序或您需要对其进行额外处理的其他方法有关(例如,它可能应该是整数,它们变成通过除以 100 或其他什么来浮动?)

[编辑] 进一步调查我怀疑ffffffffff\x00 是某种标题或元数据 所以如果我们从

myBytes = b'=\xca\x00\x00=[\x00\x00\xbf\x82H\x00B\x14\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B;\x81\n\xbf\xbat4C-\xfd\xb0B\x87\xac\xd9\x00\x00\x00\x00E\xcd\xc0\x00I\xcc\xc1\xe0'

并用struct.unpack('14f',myBytes) 解压,我们得到 14 个浮点数,如您的示例中一样......有些是零......但其余的不匹配

(7.254942539348875e-41, 3.273012823123475e-41, 6.659058584274783e-39, 1.1762210642058864e-38, 0.0, 0.0, 0.0, 1.244453845292514e-32, 2.2792208653754642e-07, -1.84210369180704e-09, -6070301691478016.0, 0.0, 1.7706052095336117e-38, -1.1171693447134314e+20)

所以我认为我们仍然没有足够的信息来实际回答这个问题,需要了解更多关于数据源和其他内容的信息

【讨论】:

  • 如果你以你的例子和struct.unpack('>14f', myBytes) 为例,你会得到一个更接近原始预期结果的范围内的浮点数。
  • 是的,似乎更接近了:)
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 2011-09-08
  • 2019-01-06
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多