长度为 60 的二进制字符串 - 最紧凑的存储方式

Binary string of length 60 - most compact way to store

我有一个长度为 60 的二进制字符串,表示一个小时中的 yes/no 个状态,我想将它们写入 Java 中的文件。我的三个目标是这应该是

  1. 紧凑(比保存为字符串更好)
  2. 在从 JavaScript
  3. 读取文件时启用一种简单的方法来重建我的二进制字符串
  4. 不使用第三方库

我的第一个想法是将字符串转换为 Long(8 字节)并保存,但由于浮点数,在 JavaScript 中读取文件时找回二进制字符串似乎很复杂数字格式和尾数长度。这样做的好方法是什么?

Java脚本可以正确处理最大为 253-1 的整数,因此如果将 60 位数据一分为二,则可以使用标准方法,并且将其存储为两个 32 位整数。

或者,您可以存储数据,例如作为 15 个字符的十六进制字符串,并将其重新编码为二进制字符串,如下所示:

function hex2bin(s) {
    return ("0000000000000000000000000000000" + parseInt(s.substr(0,8), 16).toString(2)).substr(-32)
    + ("000000000000000000000000000" + parseInt(s.substr(8,7), 16).toString(2)).substr(-28);
}
document.write(hex2bin("123456789ABCDEF"));

或者您可以使用 base-64 字符串将数据大小减少到 10 个字符,并使用如下内容对其进行解码:

function base642bin(s) {
    var b = "", e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for (var i = 0; i < 10; i++) b += ("00000" + e.indexOf(s.charAt(i)).toString(2)).substr(-6);
    return b;
}
document.write(base642bin("EjRWeJq83v"));

如果您使用内置的 Java 函数进行 base-64 编码,请检查它使用的是哪种编码 table(有时 +/ 会被替换对于其他字符)。

长二进制字符串可以转换为 BigInt 并返回二进制。

const big = BigInt('0b' + a);
// store, perform math, etc.
const binaryStr = big.toString(2);

这支持大于 253 - 1 (Number.MAX_SAFE_INTEGER) 的值。例如。这是一个正在转换的 95 个字符的二进制字符串:

BigInt('0b' + '10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101')
24847893154024981730169397005n

前缀0b告诉构造函数这是一个二进制表示。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt