【问题标题】:Compress alphanumeric characters with a limit of 8 bytes hex character压缩字母数字字符,限制为 8 个字节的十六进制字符
【发布时间】:2020-05-01 12:26:10
【问题描述】:

我的应用程序限制输入 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

有没有这样的图书馆?

【问题讨论】:

  • 为什么不直接使用 UTF8?有了它,您可以在 8 个字节中容纳 8 个字符,因此可以容纳 16 个十六进制字符。有更小的方法,但我的意思是这很有效并且很简单。

标签: javascript string hex ascii alphanumeric


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2019-07-27
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2013-10-13
    相关资源
    最近更新 更多