在 JavaScript 中将短字符串存储为很多双精度变量

问题描述 投票:0回答:1

我有 12 个字节保存为 24 个十六进制字符数组,例如:“0123456789abcdef12345678”,我必须将这个十六进制字符串存储为很多双精度变量(在时间序列数据库中)。是的,这很疯狂,但在 SaaS 应用程序中,有时我们需要做一些荒谬的变通办法是很正常的。 但是……怎么办呢?

var input = "0123456789abcdef12345678"; // always 12 bytes input, but converted to 24 hex chars string by SaaS software on beginning of this script
var output1 = 0.0; // double - probably 8 bytes
var output2 = 0.0; // double - probably 8 bytes
var output3 = 0.0; // double - probably 8 bytes
// how to divide input variable into outputX variables?

我认为可以用 2 个

output's
变量来实现,但我可以使用我需要的尽可能多的变量——如果它有帮助,但我认为,12 个变量不是最佳选择。

另一个更简单的问题:如何回滚这个,并将

output's
变量转换回
input
变量? 当然必须是无损的方式。当然,它应该在纯 JavaScript 中工作——动态类型不会让这项任务变得更容易。

那么...最有效的编码和解码方法是什么?

javascript algorithm
1个回答
0
投票

您可以将字节放在一个

Uint8Array
(长度为12)中,然后使用一个
Float64Array
(长度为1.5)作为同一缓冲区的视图,或者一个
Float32Array
(长度为3)。但是,将任意原始字节解释为浮点数可能会以
NaN
结束,这可能不会很好地序列化到您的数据库中,并可能返回不同的
NaN
值。

使用

Uint32
值要容易得多,为此您甚至不需要类型化数组。要将十六进制字符串转换为三个整数,只需对它们进行切片和解析:

var input = "0123456789abcdef12345678"; // always 12 bytes input, but converted to 24 hex chars string by SaaS software on beginning of this script
var output1 = parseInt(input.slice( 0,  8), 16);
var output2 = parseInt(input.slice( 8, 16), 16);
var output3 = parseInt(input.slice(16, 24), 16);
console.log(output1, output2, output3);

反转同样简单,只需将整数转换回十六进制字符串并将它们连接起来:

const input = [19088743, 2309737967, 305419896];
const parts = input.map(i => i.toString(16).padStart(8, '0'));
console.log(parts.join(''));

© www.soinside.com 2019 - 2024. All rights reserved.