将170位二进制字符串转换为更短的格式并再次返回(Javascript)
Convert 170 Digit Binary String Into Shorter Format and Back Again (Javascript)
我在这里做了一个小拼图模拟。
170个单元格的开/关状态(有些对用户来说是不可见的)存储在一个数组中,为了能够重新创建一个特定的配置,我在页面的底部显示了数组的内容,然后可以把它作为一个URL参数放在页面加载时"设置"一个特定的配置。
我的问题是,数组的输出是一个170位二进制数,这是相当麻烦的!
我试过使用
parseInt(input,2).toString(30)
和
parseInt(input,30).toString(2)
作为一种简单地将这个170位二进制数转换为更精简的字母数字格式的方法(并再次由我的"设置"初始化器读取),但据我所知,我正在处理的数字太大了,不适合用于这种函数。
我的下一个想法是,我可以把170位数字分成几个部分,这些部分可以被函数消化,但这似乎有点太像重新发明轮子了,因为我确信这种转换一定很常见,有人能够告诉我正确的方法。
提前感谢!
你的想法是正确的,除了JavaScript不能准确地表示那么大的数字。你的170位数字失去了它的准确性,当你把它转换为JavaScript数字使用parseInt
;它不代表原始数字。
解决方案很简单:使用您自己的数字解析函数,将170位数字处理成更小的块。
function encode(a) {
var b = "";
while (a.length > 0) {
b = parseInt(a.slice(-5), 2).toString(32) + b;
a = a.slice(0, -5);
}
return b;
}
function decode(a) {
var b = "";
while (a.length > 0) {
b = ("00000" + parseInt(a.slice(-1), 32).toString(2)).slice(-5) + b;
a = a.slice(0, -1);
}
return b;
}
var s = "00000000000000010101110100001010100010000111011101000010101000100001010111011100000000000000010001110010001000101001000100010100100010001010000001110111001000000000000000";
var e = encode(s); // "000lq2k8et1a45es002748kh2i4a0tp000"
var d = decode(e); // d === s
更一般的功能:
function convert(string, base1, base2) {
var result = "",
chunkw = 0, // number of characters to write per chunk
chunkr = 0, // number of characters to read per chunk
padstr = "", // string of zeros for padding the write chunks
slice;
while (Math.pow(2, chunkw) < base1) chunkw += 1;
while (Math.pow(2, chunkr) < base2) chunkr += 1;
while (padstr.length < chunkw) padstr += "0";
while (string.length > 0) {
slice = string.slice(-chunkr);
slice = parseInt(slice, base1).toString(base2);
slice = (padstr + slice).slice(-chunkw);
result = slice + result;
string = string.slice(0, -chunkr);
}
return result;
}
var x = "00000000000000010101110100001010100010000111011101000010101000100001010111011100000000000000010001110010001000101001000100010100100010001010000001110111001000000000000000";
var a = convert(x, 2, 32);
var b = convert(a, 32, 2);
console.log(x + "'n" + a + "'n" + b);
// 00000000000000010101110100001010100010000111011101000010101000100001010111011100000000000000010001110010001000101001000100010100100010001010000001110111001000000000000000
// 000lq2k8et1a45es002748kh2i4a0tp000
// 00000000000000010101110100001010100010000111011101000010101000100001010111011100000000000000010001110010001000101001000100010100100010001010000001110111001000000000000000
相关文章:
- 连续两页返回Javascript
- 返回Javascript中字符串的特定部分
- 返回 JavaScript 类值而不是对象引用
- 返回JavaScript函数中的值
- 基本否则如果并返回JavaScript
- 如何让php“json_encode”返回Javascript数组而不是Javascript对象
- 函数内部的函数vs函数返回JavaScript中的函数
- 返回Javascript中给定正则表达式的文本范围数组
- 返回javascript中regex字符串的一部分
- 返回javascript对象中的最大值
- AJAX请求返回Javascript获胜't返回特定函数,但将返回其他函数
- 检测数组的所有函数何时返回:javascript
- 函数,返回javascript中两个字符串数组的差值
- 返回javascript数组中具有最低值的对象
- 返回javascript中最匹配的数组项
- 试图理解返回javascript方法的服务器响应
- 获取 Checked Checbox 的值返回 JavaScript/ASP.NET VB 中未定义的值
- 如何在金字塔/塔中返回 JavaScript
- 返回 javascript 中数组的数字
- 返回 JavaScript 对象警报“未定义”