压缩字母数字字符,限制为 8 个字节的十六进制字符

Compress alphanumeric characters with a limit of 8 bytes hex character

我的应用程序限制输入 16 个十六进制字符来表示 8 个 ASCII 字符。我需要的唯一字符是 A-Z 和 0-9。我不需要小写字母或任何非标准的字母数字字符。一个 2 个字符的十六进制可以表示键盘上的所有字符,但我不需要所有字符。

是否有某种类型的库可以压缩字母数字字符串以使其适合 16 个十六进制字符?

示例:

12345678 = 31 32 33 34 35 36 37 38

我希望能够像这样打包更多的字母数字字符:

ABCDEFGHI12345678 = 31 32 33 34 35 36 37 38

有图书馆做这件事吗?

经过一些实验,这是我的压缩算法。

它将包含 A-Z 和 0-9 的 6 个字符的消息转换为 8 个十六进制字符。

可以使用两次将12个字符的字符串压缩成16个十六进制字符。

如果我的数学是正确的,这是你能达到的最佳压缩,因为 16^16 几乎等于 36^(12.38),这意味着你最多可以容纳 36- 的 12 个字符字符集 (A-Z, 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'