压缩字母数字字符,限制为 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'
我的应用程序限制输入 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'