压缩最多8个字节的十六进制字母数字字符

问题描述 投票:-1回答:1

我的应用程序具有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

是否有这样做的图书馆?

javascript string hex ascii alphanumeric
1个回答
0
投票

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

可以接收包含A-Z和0-9的6个字符的消息,并将其转换为8个十六进制字符。

它可以被使用两次,以12个字符的字符串压缩为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);
const extractedMessageCode = hexToInt(messageHex);
const extractedMessage = intToString(extractedMessageCode);
console.log('extractedMessageCode:', extractedMessageCode);
console.log('extractedMessage:', extractedMessage);
© www.soinside.com 2019 - 2024. All rights reserved.