Сжать алфавитные символы c символов с ограничением в 8 байт шестнадцатеричных символов - PullRequest
0 голосов
/ 14 января 2020

Мое приложение имеет ограничение ввода 16 шестнадцатеричных символов для представления 8 символов ASCII. Единственные символы, которые мне нужны - это AZ и 0-9. Мне не нужны строчные буквы или какие-либо нестандартные символы алфавита c. Гекс из 2 символов может представлять все символы на клавиатуре, но мне все это не нужно.

Существует ли какой-либо тип библиотеки, которая может сжимать строку alphanumeri c, чтобы можно было уместить ее в 16 шестнадцатеричных символов?

Пример:

12345678 = 31 32 33 34 35 36 37 38

Я хочу иметь возможность упаковывать больше alphanumeri c символов, таких как:

ABCDEFGHI12345678 = 31 32 33 34 35 36 37 38

Есть ли библиотека, которая делает это?

1 Ответ

1 голос
/ 15 января 2020

После некоторых экспериментов вот мой алгоритм сжатия.

Он принимает 6-символьное сообщение, содержащее AZ и 0-9, и превращает его в 8 шестнадцатеричных символов.

Может использоваться дважды сжать как 12-символьную строку в 16 шестнадцатеричных символов.

Если моя математика верна, это лучшее сжатие, которое вы можете достичь, потому что 16^16 почти равно 36^(12.38), что означает, что вы можете поместите не более 12 символов набора из 36 символов (AZ, 0-9) в 16 шестнадцатеричных символов.

Надеюсь, это будет полезно для вашего приложения.

const testMessage = '6CHARS';

function charToInt(char, shift) {
  let charCode = char.charCodeAt(0) - 48;
  if (charCode > 9) {
    charCode -= 7;
  }
  charCode *= 36 ** shift;
  return charCode;
}

function intToChar(int, shift) {
  let number = int / (36 ** shift);
  if (number > 9) {
    number += 7;
  }
  number += 48;
  return String.fromCharCode(number);
}

function stringToInt(stringWithSixCharacters) {
  let result = 0;
  for (let index = 0; index < 6; index++) {
    result += charToInt(stringWithSixCharacters.charAt(index), 5 - index);
  }
  return result;
}

function intToString(intFromSixCharacters) {
  let number = intFromSixCharacters;
  let result = '';
  for (let index = 0; index < 6; index++) {
    const mod = number % (36 ** (index + 1));
    const char = intToChar(mod, index);
    result = char + result;
    number = number - mod;
  }
  return result;
}

function intToHex(int) {
    return int.toString(16).padStart(8, '0').toUpperCase();
}

function hexToInt(hex) {
    return parseInt(messageHex, 16);
}

console.log('testMessage:', testMessage);
const messageCode = stringToInt(testMessage);
const messageHex = intToHex(messageCode);
console.log('messageCode:', messageCode);
console.log('hex:', messageHex); // prints '16DFB4C8'
const extractedMessageCode = hexToInt(messageHex);
const extractedMessage = intToString(extractedMessageCode);
console.log('extractedMessageCode:', extractedMessageCode);
console.log('extractedMessage:', extractedMessage); // prints '6CHARS'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...