如何解析由带符号的 8.8 定点符号表示的十六进制值? (JavaScript)

How to parse a hex value that is represented by signed 8.8 fixed-point notation? (JavaScript)

我想解析一个 "expressed in a signed 8.8 fixed-point notation" 的两字节值。假设我有下面十六进制格式的两个字节。

let data = '1800';

十六进制8.8定点数的0x1800转换后应为24

另一个例子:0x8000十六进制有符号8.8定点数转换后应该是-128。

更多详情

我专门尝试从此处定义的 Eddystone 遥测帧解析温度:https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md#field-notes

您可以从自定义对象创建原型。像这样:

function FixedPoint(fraction){
  this.fraction = fraction;
}

FixedPoint.prototype.calculate = function(value){
  let intValue = parseInt(value, 16);
  let signed = (intValue & 0x8000) > 0 ? -1 : 1;
  return signed * intValue / Math.pow(2, this.fraction);
}

如何使用?

let example = new FixedPoint(8);
example.calculate('1840');

returns 24.25

有关 fixed point here

的更多信息

您可以将值左移,使其符号位与 JavaScript 的 32 位有符号整数对齐:

let data = 0x8000;  // = parseInt('8000', 16);
data << 16          // -2147483648

然后除以高字节代表0-255:

(data << 16) / (1 << 24)  // -128