【问题标题】:how can I convert a bytearray in to a float in python 3如何在 python 3 中将字节数组转换为浮点数
【发布时间】:2018-02-12 08:23:28
【问题描述】:

我需要计算一个 2 字节数组的十进制值。 作为输入,我得到一个字节数组(等式的第一部分)。 我将其解析为 2 个字节(等式的中间部分)。 我知道结果是什么(等式的最后一部分)。

bytearray(b'\x11\xc7') = b'11c7' = 18.2

bytearray(b'\x07\x1b') = b'071b' = 18.19

bytearray(b'>Y') = b'3e59' = 2080

bytearray(b'>Z') = b'3e5a' = 2081.28

如何计算这些值?

【问题讨论】:

  • 您需要告诉我们这个 2 字节格式是什么。 (如果您不知道,则需要找出答案。)文档说明了什么?
  • FTR,它不是 IEEE 754 binary16 格式,具有两种字节序。考虑到字节序列 \x11\xc7\x07\x1b 对于类似的输出有多么不同,它看起来也不像是任何一种理智的定点格式。

标签: arrays python-3.x floating-point type-conversion


【解决方案1】:

2 字节格式是来自 KNX 的“DTP-9”格式。 folowilg 函数完成了这项工作:

def calculate(raw):
    """Parse/deserialize from KNX/IP raw data. DTP-9"

    data = (raw[0] * 256) + raw[1]
    exponent = (data >> 11) & 0x0f
    significand = data & 0x7ff
    sign = data >> 15

    if sign == 1:
        significand = significand - 2048

    value = float(significand << exponent) / 100

    return value

(在 xknx.io 上找到信息)

非常感谢!

【讨论】:

    【解决方案2】:

    谢谢@emence,我用你的答案来快速回答:

    static func byteToFloat(_ raw:[UInt8])->Float{
        let data = (UInt32(raw[0]) * (256 as UInt32)) + UInt32(raw[1])
        let exponent = (data >> 11) & 0x0f
        var significand = UInt32(data) & (0x7ff as UInt32)
        let sign = data >> 15
    
        if sign == 1 {
            significand = significand - (2048 as UInt32)
        }
        
        let value = Float(significand << exponent) / 100
    
        return value
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2012-11-08
      相关资源
      最近更新 更多