将ASCII编码的字符串转换为普通字符串-Javascript

时间:2019-01-19 01:38:12

标签: javascript

我有一个ASCII字符串,我需要将其转换为普通字符串。

var asciiString = '84114117116104326510811997121115328710511011532'

function strFunc(str) {
    var result = []

    var strSplit = str.split('');

    var validAscii = ['32'];
    for(var i=65; i<=90; i++) {
        validAscii.push(i.toString());
    }
    for(var i=97; i<=122; i++) {
        validAscii.push(i.toString());
    }
    strSplit.forEach((item, index) => {
        if(validAscii.includes(parseInt(item))) {
            result.push(item)
        } else if (validAscii.includes(`${parseInt(strSplit[index])}${parseInt(strSplit[index + 1])}`)){
            result.push(item)
        }
    })
    return result.fromCharCodeAt(...result)
}

console.log(strFunc(asciiString))

为什么它返回一个空字符串?我需要将字符串拆分为2位或3位数字,并将其与我构建的数组进行比较。

字符串应拆分为[84,114,117,116,104,32,65,...],表示为 TRUTH A .... 请指教。

3 个答案:

答案 0 :(得分:1)

合并字符串的两个元素时,需要在连接结果上调用parseInt() *,而不是将parseInt()的结果连接。所以应该是:

} else if (validAscii.includes(parseInt(item + strSplit[index+1]))){

由于ASCII值可以是3位数字,因此您需要另一个else if来查找item + strSplit[index+1] + strSplit[index+2]

另一个问题是您正在将item推入结果字符串。但是要获得相应的字符,您需要使用String.fromCharCode()将串联的ASCII代码转换为字符。

strSplit.forEach((item, index) => {
  if (validAscii.includes(parseInt(item))) {
    result.push(String.fromCharCode(item))
  } else if (validAscii.includes(parseInt(item + strSplit[index+1]))) {
    result.push(String.fromCharCode(parseInt(item + strSplit[index+1]))
  } else if (validAscii.includes(parseInt(item + strSplit[index+1] + strSplit[index+2]))) {
    result.push(String.fromCharCode(parseInt(item + strSplit[index+1] + strSplit[index+2]))
  }
})

请注意,像这样使用forEach可能不是一个好主意。如果输入中有validAscii中都重叠的项,则将它们都添加到结果中。例如。如果它包含678,则将同时匹配67和78 , and add the corresponding characters to the result. Instead, you should use an ordinary for`循环,并以匹配的字符数增加索引。

答案 1 :(得分:1)

我会这样做

const encodedString = '84114117116104326510811997121115328710511011532';
const codes = [];
for (let i = 0; i < encodedString.length;) {
  const numDigits = encodedString[i] === '1' ? 3 : 2;
  codes.push(encodedString.substr(i, numDigits));
  i += numDigits;
}
const str = String.fromCharCode(...codes);
console.log(`"${str}"`);

一些注意事项:

  • 它假定编码字符串中的值从32到127。没有错误检查

  • 没有必要调用parseInt,因为JavaScript会将数字字符串转换为数字,因此可以将数字作为字符串传递给String.fromCharCode

关于代码为何无法正常工作的问题,其中包括

  1. 它遍历每个字符,而不是每个代码。

    它循环遍历8、4、1、1、4,...,而不是84、114,...

    这意味着任何测试都不会通过,因为item永远不会在validAscii中找到,这意味着result将一无所有。

  2. 没有功能Array.fromCharCodeAt

    result是一个数组,没有array.fromCharCodeAt这样的函数。如果结果中包含正确的代码,则可以使用String.fromCharCode(...result)

答案 2 :(得分:0)

您希望parseInt围绕模板字符串,而不是单个项目。您正在检查字符串是否包含在填充数字的数组中。

var asciiString = '84114117116104326510811997121115328710511011532'

function strFunc(str) {
    var result = []

    var strSplit = str.split('');

    var validAscii = [32];
    for(var i=65; i<=90; i++) {
        validAscii.push(i);
    }
    for(var i=97; i<=122; i++) {
        validAscii.push(i);
    }
    strSplit.forEach((item, index) => {
        if(validAscii.includes(parseInt(item))) {
            result.push(item)
        } else if (validAscii.includes(parseInt(`${(strSplit[index])}${(strSplit[index + 1])}`))){
        
            result.push(item);
        }
    })
    return result.join('');
}

console.log(strFunc(asciiString))