将坐标值转换为fixed64 protobuf obj

2024-09-26 17:49:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将一个坐标值(一个浮点值)转换成protobuf对象,然后发送到服务器 问题是我需要把它转换成fixed64对象, 它有64位长,javascript不支持这么长的数字。在

我正在使用this库来创建我的protobuf缓冲区。 我发现了一个可以处理相同问题的python代码片段

def f2i(float):
  return struct.unpack('<Q', struct.pack('<d', float))[0]

它使用struct库,基本上将浮点转换为二进制,然后再转换回long。 我需要得到同样的输出

所以51.366805将变成463242605243037296

失去一点精度不是最大的问题,我只需要转换值


Tags: 对象代码服务器def数字javascriptfloatthis
1条回答
网友
1楼 · 发布于 2024-09-26 17:49:30

正如您所提到的,JS不支持64位整数,因此您将无法获得相同的输出。最接近的是两个32位整数,它们代表同一个64位整数,这取决于Protobuf库期望的输入类型。在

我建议查看一下this question的可接受答案中的toFloat64()函数。在

下面是一个稍微简化的版本:

function toFloat64(value) {
  var hiWord = 0, loWord = 0;

  if (value <= -0.0) {
      hiWord = 0x80000000;
      value = -value;
  }

  var exponent = Math.floor(Math.log(value) / Math.log(2));
  var significand = Math.floor((value / Math.pow(2, exponent)) * Math.pow(2, 52));

  loWord = significand & 0xFFFFFFFF;
  significand /= Math.pow(2, 32);

  exponent += 1023;
  if (exponent >= 0x7FF) {
      exponent = 0x7FF;
      significand = 0;
  } else if (exponent < 0) exponent = 0;

  hiWord = hiWord | (exponent << 20);
  hiWord = hiWord | (significand & ~(-1 << 20));

  return [hiWord, loWord];
}

让我们试试看:

^{pr2}$

输出:

32-bit high word = 0x4049aef3
32-bit low word  = 0x775b8130
64-bit result    = 0x4049aef3775b8130

其中0x4049aef3775b8130在转换回十进制数后确实是4632426052430037296。在

如果您真的需要一个原子JS号,最后一个选择是将它转换回53位精度的整数:

var int53 = parseInt(hexHi + hexLo, 16);
console.log(int53);

输出:

4632426052430037000

相关问题 更多 >

    热门问题