2016-12-16 3 views
0

У меня очень простая HTML-форма с десятью кнопками (1/0) и одним выбором ввода с двузначными числами в качестве значений. Результат из всей формы можно записать в виде 12-значного числа, например 000060000111 (где 5-я и 6-я цифры представляют номер из входного сигнала выбора).Сжатие/кодирование значений формы для короткой, читаемой строки

Моя цель состоит в том, чтобы сжать/закодировать эту последовательность, используя JavaScript, в короткую, читаемую человеком строку с буквами и цифрами, чтобы ссылаться на значения формы. 6-значная строка, содержащая числа и буквы, была бы идеальной (например, An3K7d). Следует избегать неоднозначных символов, таких как I и l.

Я попытался преобразовать последовательность с Base64, но выход еще длиннее.

+0

Если вы хотите, чтобы избежать неоднозначности, вы можете захотеть использовать [base32] (https: //en.wikipedia .org/wiki/Base32) вместо base64, которая предназначена для избежания неоднозначных символов. – Frxstrem

ответ

1

Если я правильно понимаю ваше описание, вы можете легко закодировать его на три символа.

Есть 1024 возможных настроек переключения и 100 возможных двузначных чисел, поэтому 102 400 возможных значений. Кубический корень из них меньше 47, поэтому он может быть представлен тремя символами, выбранными из набора из 47. Вы можете использовать только буквы верхнего и нижнего регистра, а также оставить те, которые вам не нравятся (например, I, l , o, O, что угодно), и все еще осталось много. Или вы можете вставлять цифры там и использовать меньше букв. Что вы предпочитаете.

Для кодирования просто преобразуйте входы в целое число в диапазоне 0,102,399. Это будет просто 10-битное число для переключателей, умноженное на 100, а затем 0..99 для двузначного ввода.

Затем закодируйте это целое число в базе 47, последовательно разделив его на 47, взяв остаток в виде цифры и используя коэффициент для следующего деления. Чтобы декодировать, перекомпилируйте базовые 47 цифр, умножив их, а затем извлеките свою входную информацию.

+0

Благодарим вас за отличное объяснение. Я очень новичок в этом, но с вашей помощью мне удалось написать функции кодирования/декодирования, которые я опубликую позже. – ohh2ahh

0

Благодаря превосходному ответу Марка я решил свою проблему с помощью следующего кода (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)