我在github上找到了一些示例代码来从Texas Instruments传感器标签中提取温度:
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转换为float。为什么?我不明白
德州仪器(TI)的示例代码可在以下位置找到:
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;
}
我确实向开发人员提出了此要求,但没有得到答复。
最佳答案
在磁盘和内存中,整数存储为特定的位宽。现代Python的int
允许我们忽略大部分细节,因为它们可以神奇地扩展到所需的大小,但是有时当我们从磁盘或其他系统中获取值时,我们必须考虑它们的实际存储方式。
16位带符号整数的正值将存储在0x0001
-0x7fff
范围内,其负值将存储在0x8000
-0xffff
中。如果以某种尚未检查符号位的方式读取该值(可能是无符号整数,或者是较长整数的一部分,或者由两个字节组合而成),那么我们需要恢复符号。
怎么样?好吧,如果该值超过0x7fff
,我们知道它应该为负,并且负值存储为two's complement。因此,我们只需从中减去0x10000
即可得到负值。