我有一个非常简单的HTML表单,有十个切换(1
/ 0
)和一个选择输入,两位数字作为值。整个表单的结果可以写成12位数字,如000060000111
(其中第5和第6位代表选择输入中的数字)。
我的目标是使用JavaScript将此序列压缩/编码为一个简短的,人类可读的字符串,其中包含字母和数字,以引用表单的值。包含数字和字母的6位数字符串将是完美的(例如An3K7d
)。应避免使用I
和l
等不明确的字符。
我尝试使用Base64转换序列,但输出更长。
答案 0 :(得分:1)
如果我正确理解您的描述,您可以轻松地将其编码为三个字符。
有1024种可能的切换设置和100种可能的两位数字,因此总共有102,400种可能的值。它的立方根小于47,所以它可以用一组47中的三个字符表示。你可以只使用大写和小写字母,而忽略你不喜欢的字母(比如我) ,l,o,O,等等,还剩下很多。或者你可以在那里扔数字并使用更少的字母。无论你喜欢什么。
要进行编码,只需将输入转换为0..102,399范围内的整数。它只是一个10位数的切换,再乘以100,然后为两位数输入添加0..99。
然后通过连续除以47,将余数作为数字,并使用商进行下一次除法,在基数47中对该整数进行编码。要进行解码,请通过乘以重新组合基数为47的数字,然后提取输入信息。
答案 1 :(得分:0)
感谢Mark的优秀答案,我使用以下代码(CodePen Demo)解决了我的问题:
// Base 47 characters
var chars = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z', 'b', 'c', 'd', 'e',
'f', 'g', 'h', 'm', 'n', 'p', 'q', 'r', 't',
'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4',
'6', '7'
];
function encode(value) {
// Get toggle values and convert binary to decimal
var toggles = value.slice(0, value.length - 2); // string
var decimal = parseInt(toggles, 2); // number (0..1023)
// Get two-digit select value
var select = parseInt(value.slice(value.length - 2)); // number (0..99)
// Combine toggle and select values to a single integer
var possibility = (decimal * 100) + select; // number (0..103499)
var output = '';
// Get base47 value by successively dividing by 47,
// taking the remainder as a digit, and using the quotient
// for the next division
for(var i = 0; i < 3; i++) {
var quotient = Math.floor(possibility/47);
var remainder = possibility - (quotient * 47);
possibility = quotient;
output += chars[remainder];
}
return output;
} // encode(value)
function decode(value) {
var possibility = 0;
// Loop through base47 string, beginning from the end
// Recombine the base 47 digits by successively multiplying by 47
for(var i = value.length - 1; i >= 0; i--) {
var item = value[i];
var remainder = chars.indexOf(value[i]);
possibility = (possibility * 47) + remainder;
}
// Convert number to string
possibility = possibility.toString();
// Fill numbers < 3 digits with leading zeros
while(possibility.length < 3) { possibility = '0' + possibility; }
// Get toggles and select values from string
var toggles = possibility.slice(0, possibility.length - 2);
var select = possibility.slice(possibility.length - 2);
// Convert toggles string to binary string and add leading zeros
var binary = parseInt(toggles, 10).toString(2);
while(binary.length < 10) { binary = '0' + binary; }
// Return binary toggle values, followed by the select values
return binary + select;
} // decode(value)