1

我在 github 上找到了一些从德州仪器传感器标签中提取温度的示例代码: https ://github.com/msaunby/ble-sensor-pi/blob/master/sensortag/sensor_calcs.py

我不明白以下代码的作用:

tosigned = lambda n: float(n-0x10000) if n>0x7fff else float(n)

我如何阅读上面的代码:

if n>0x7fff: n = float(n-0x10000)
else n = float(n)

基本上发生的事情是将二进制补码值(n)转换为浮点数。为什么只有当 n 的值大于 0x7fff 时才会发生这种情况?如果值为 0x7fff 或更小,那么我们只需将 i 转换为浮点数。为什么?我不明白这一点。

德州仪器的示例代码可以在这里找到:http: //processors.wiki.ti.com/index.php/SensorTag_User_Guide#SensorTag_Android_Development

为什么TI示例代码中这个函数的返回值除以128.0?

private double extractAmbientTemperature(BluetoothGattCharacteristic c) {
    int offset = 2;
    return shortUnsignedAtOffset(c, offset) / 128.0;
}

我确实向开发人员提出了这个问题,但没有得到答复。

4

2 回答 2

2

在磁盘和内存中,整数以特定的位宽存储。现代 Python 的ints 允许我们忽略大部分细节,因为它们可以神奇地扩展到所需的任何大小,但有时当我们从磁盘或其他系统获取值时,我们必须考虑它们的实际存储方式。

16 位有符号整数的正值将存储在0x0001-范围内0x7fff,其负值将存储在0x8000-范围内0xffff。如果以某种尚未检查符号位的方式读取此值(可能作为无符号整数,或较长整数的一部分,或由两个字节组合而成),那么我们需要恢复符号。

如何?好吧,如果值结束了,0x7fff我们知道它应该是负数,并且负值存储为二进制补码。所以我们简单地减去0x10000它,我们得到负值。

于 2015-01-29T21:23:17.320 回答
1

所以你在有符号的十六进制和浮点数之间转换。在 python 中,带符号的浮点数显示为带有负号,因此您可以忽略它在内存中的实际表示方式。但在十六进制中,数字的负数部分表示为值的一部分。因此,为了正确转换,需要进行转换。

您可以使用 Python 解释器自己玩这个:

tosigned = lambda n: float(n-0x10000) if n>0x7fff else float(n)
print(tosigned(0x3fff))

相对:

unsigned = lambda n: float(n)

查看此内容以了解更多信息:

http://www.swarthmore.edu/NatSci/echeeve1/Ref/BinaryMath/NumSys.html

于 2015-01-29T21:12:30.170 回答