在JavaScript中从具有任意基数的整数生成字符串会收到以下答案:
function parseInt(value, code) {
return [...value].reduce((r, a) => r * code.length + code.indexOf(a), 0);
}
function toString(value, code) {
var digit,
radix= code.length,
result = '';
do {
digit = value % radix;
result = code[digit] + result;
value = Math.floor(value / radix);
} while (value)
return result;
}
console.log(parseInt('dj', 'abcdefghijklmnopqrstuvwxyz0123456789+-'));
console.log(toString(123, 'abcdefghijklmnopqrstuvwxyz0123456789+-'));
console.log(parseInt('a', 'abcdefghijklmnopqrstuvwxyz0123456789+-'));
console.log(toString(0, 'abcdefghijklmnopqrstuvwxyz0123456789+-'));
我对有些不同感兴趣。尽管这将生成该数字的最短代码,但我现在想根据位数来生成一个恒定长度的代码。我不确定这是否也是一个复杂的基数解决方案。
假设我想使用16个字符的字母生成8位代码。这意味着我应该能够使用前4位选择一个字符,然后使用后4位选择第二个字符。因此,MV
如果我的16个字符集是,我可能最终会遇到ABDHNMOPQRSTUVYZ
。同样,如果我有16位范围,我将有4个字符代码,而32位范围将是8个字符代码。因此,调用code32(1, 'ABDHNMOPQRSTUVYZ')
将给出8个字母代码,而code8(1, 'ABDHNMOPQRSTUVYZ')
给出2个数字代码。
用JavaScript如何实现呢?遵循这些原则?
code8(i, alpha) // 0 to 255 it accepts
code16(i, alpha) // 0 to 65535 it accepts
code32(i, alpha) // 0 to 2^32-1 it accepts
同样,如何将字符串代码恢复为原始数字(或位序列)?
这实际上归结为更改,toString
以便:
您将用于16位数字的实际位数取决于代码的大小。如果代码包含16个字符,则它可以覆盖4位,因此需要输出4个字符。但是,如果代码包含4个字符,则输出将需要8个字符。您可能会遇到不完全匹配的情况,例如您的代码包含8个字符。然后输出将需要6个字符。
在这里,我重点介绍了该toString
方法的更改。我个人的喜好也是将值作为最后一个参数toString
。
function toString(digitCount, code, value) { // <-- add argument digitCount
// Perform a sanity check: code must have a length that is power of 2
if (Math.log2(code.length) % 1) throw "code size not power of 2: " + code.length;
var digit,
radix = code.length,
result = '';
do {
digit = value % radix;
result = code[digit] + result;
value = Math.floor(value / radix);
} while (value)
return result.padStart(digitCount, code[0]); // Pad to the desired output size
}
console.log(toString(4, 'abcdefghijklmnop', 123));
console.log(toString(4, 'abcdefghijklmnop', 0));
console.log(toString(4, 'abcdefghijklmnop', 0xFFFF));
// You could define some more specific functions
const code8 = (code, value) => toString(Math.ceil(8 / Math.log2(code.length)), code, value);
const code16 = (code, value) => toString(Math.ceil(16 / Math.log2(code.length)), code, value);
console.log(code16('abcdefghijklmnop', 123));
console.log(code16('abcdefghijklmnop', 0));
console.log(code16('abcdefghijklmnop', 0xFFFF));
console.log(code8('abcdefghijklmnop', 123));
console.log(code8('abcdefghijklmnop', 0));
console.log(code8('abcdefghijklmnop', 0xFF));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句