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

时间:2015-11-29 03:29:43

标签: javascript java byte

我有一个长度为60的二进制字符串,表示一小时的分钟是/否状态,我想用Java编写它们。我的三个目标是,这应该是

  1. compact(比保存为字符串更好)
  2. 从JavaScript中读取文件时,可以轻松地重建二进制字符串
  3. 不使用第三方库
  4. 我的第一个想法是将字符串转换为Long(8字节)并保存,但由于浮点数格式和尾数长度,在JavaScript中读取文件时,我的二进制字符串似乎很复杂。有什么好办法呢?

2 个答案:

答案 0 :(得分:0)

Javascript可以正确处理最多2 53 -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编码,请检查它使用的编码表(有时+/将替换其他字符。)

答案 1 :(得分:0)

长二进制字符串可以转换为 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