将表单值压缩/编码为简短,可读的字符串

时间:2016-12-16 12:30:02

标签: javascript compression

我有一个非常简单的HTML表单,有十个切换(1 / 0)和一个选择输入,两位数字作为值。整个表单的结果可以写成12位数字,如000060000111(其中第5和第6位代表选择输入中的数字)。

我的目标是使用JavaScript将此序列压缩/编码为一个简短的,人类可读的字符串,其中包含字母和数字,以引用表单的值。包含数字和字母的6位数字符串将是完美的(例如An3K7d)。应避免使用Il等不明确的字符。

我尝试使用Base64转换序列,但输出更长。

2 个答案:

答案 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)