如何将数组转换为可能的最短字符串
how to convert an array to the shortest string possible
我有以下数组(我正在使用 JavaScript):
var arr = [2, 0, 0, 0, 12]
(数组的每个元素可以在0
到15
之间。长度固定,5个元素。)
我想将此数组转换为可能的最短字符串。我的实际解决方案是将其转换为十六进制(base16)字符串:
var str = '2000c'
有更好的解决办法吗? (我正在 JavaScript 中寻找解决方案,如果可能的话没有任何库)
您可以使用 toString(base)
将您的 10 进制数转换为您需要的 base.e.g,十六进制(16 进制)
function encode(input){
var encoded = input.map(function(num){
return num.toString(16);
}).join('');
return encoded;
}
输出:
>
encode([2, 0, 0, 0, 12]);
'2000c'
您的输入是 5 * 4 位 = 20 位。您可以将数组重新编码为 3 个字符的字符串(24 位,实际负载为 20 位)并使用 btoa() 对其进行编码以生成 4 个字符的可打印字符串。
function pack(arr) {
return btoa(
String.fromCharCode(
(arr[1] << 4) | arr[0],
(arr[3] << 4) | arr[2],
arr[4]
)
);
}
var packed = pack([2, 0, 0, 0, 12]);
console.log(packed); // output: 'AgAM'
解包函数将使用 atob() 并像这样重建原始数组:
function unpack(packed) {
var str = atob(packed);
return [
str.charCodeAt(0) & 0xf,
str.charCodeAt(0) >> 4,
str.charCodeAt(1) & 0xf,
str.charCodeAt(1) >> 4,
str.charCodeAt(2)
];
}
var unpacked = unpack('AgAM');
console.log(unpacked); // output: [ 2, 0, 0, 0, 12 ]
我有以下数组(我正在使用 JavaScript):
var arr = [2, 0, 0, 0, 12]
(数组的每个元素可以在0
到15
之间。长度固定,5个元素。)
我想将此数组转换为可能的最短字符串。我的实际解决方案是将其转换为十六进制(base16)字符串:
var str = '2000c'
有更好的解决办法吗? (我正在 JavaScript 中寻找解决方案,如果可能的话没有任何库)
您可以使用 toString(base)
将您的 10 进制数转换为您需要的 base.e.g,十六进制(16 进制)
function encode(input){
var encoded = input.map(function(num){
return num.toString(16);
}).join('');
return encoded;
}
输出:
>
encode([2, 0, 0, 0, 12]);'2000c'
您的输入是 5 * 4 位 = 20 位。您可以将数组重新编码为 3 个字符的字符串(24 位,实际负载为 20 位)并使用 btoa() 对其进行编码以生成 4 个字符的可打印字符串。
function pack(arr) {
return btoa(
String.fromCharCode(
(arr[1] << 4) | arr[0],
(arr[3] << 4) | arr[2],
arr[4]
)
);
}
var packed = pack([2, 0, 0, 0, 12]);
console.log(packed); // output: 'AgAM'
解包函数将使用 atob() 并像这样重建原始数组:
function unpack(packed) {
var str = atob(packed);
return [
str.charCodeAt(0) & 0xf,
str.charCodeAt(0) >> 4,
str.charCodeAt(1) & 0xf,
str.charCodeAt(1) >> 4,
str.charCodeAt(2)
];
}
var unpacked = unpack('AgAM');
console.log(unpacked); // output: [ 2, 0, 0, 0, 12 ]