我有一个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 .... 请指教。
答案 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
。
关于代码为何无法正常工作的问题,其中包括
它遍历每个字符,而不是每个代码。
它循环遍历8、4、1、1、4,...,而不是84、114,...
这意味着任何测试都不会通过,因为item
永远不会在validAscii
中找到,这意味着result
将一无所有。
没有功能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))