![](/img/trans.png)
[英]how to convert array of integers into hex string and vice versa in javascript
[英]Convert string to array of integers and vice versa in JavaScript
我有一个数组,每个单元格可以保留4个字节(2 ** 32)。 这个数组显示了我用JS编写的VM的内存。 我也有字符串。 只有一个地方我可以保留这个字符串 - 我在上面描述的记忆。
我决定在内存中将字符串呈现为C字符串(特殊符号NUL作为字符串的结尾)。 我目前的实施看起来很难看,我问你建议,有没有办法改进这种方法? 也许还有其他办法吗?
代码的一部分,它将字符串转换为数组:
// demoMemory presents memory model
var DEMO_VOLUME = 16;
var demoMemory = new Array(DEMO_VOLUME);
for (var i = 0; i < DEMO_VOLUME; i++) demoMemory[i] = 0;
// convert string to hexidecimal string
var string = "Hello, World!", hexString = "";
for (var i = 0; i < string.length; i++) {
hexString += string.charCodeAt(i).toString(16);
}
// convert hexidecimal string to array of strings
// each element of this array presents 4 symbols
var hexStringArray = hexString.match(/.{1,8}/g);
// add NUL (0x00) symbols to complete strings
while (hexStringArray[hexStringArray.length - 1].length != 8) {
hexStringArray[hexStringArray.length - 1] += "00";
}
// convert to integer array
for (var i = 0; i < hexStringArray.length; i++) {
demoMemory[i] = parseInt(hexStringArray[i], 16);
}
...并返回字符串:
// decode back to string
var resultString = "", decSymbolCode = 0;
for (var i = 0; i < demoMemory.length; i++) {
hexString = demoMemory[i].toString(16);
var hexSymbolCodeArray = hexString.match(/.{1,2}/g);
for (var j = 0; j < hexSymbolCodeArray.length; j++) {
decSymbolCode = parseInt(hexSymbolCodeArray[j], 16);
resultString += String.fromCharCode(decSymbolCode);
}
}
这段代码是不可靠的,因为我使用JS Strings来构建十六进制字符串。 我认为可以使用按位操作和掩码,但我不知道,如何。 也许我错了。
这是一个代码,使用掩码和按位运算将字符串转换为32位数字的数组,反之亦然:
var demoMemory = [];
function stringToArray(str) {
var i,
length = str.length,
arr = [];
for(i=0; i<length; i+=4) {
arr.push(
(((str.charCodeAt(i) || 0) << 24)
|((str.charCodeAt(i+1) || 0) << 16)
|((str.charCodeAt(i+2) || 0) << 8)
|((str.charCodeAt(i+3) || 0)))
);
}
if(length % 4 === 0) {
arr.push(0);
}
return arr;
}
function arrayToString(arr) {
var i, j, chrCode,
length = arr.length,
str = [];
label:
for(i=0; i<length; i++) {
for(j=24; j>=0; j-=8) {
chrCode = (arr[i] >> j) & 0xFF;
if(chrCode) {
str.push(String.fromCharCode(chrCode));
} else {
break label;
}
}
}
return str.join('');
}
console.log(demoMemory = stringToArray('Hello, World!')); // => [1214606444, 1865162839, 1869769828, 553648128]
console.log(arrayToString(demoMemory)); // "Hello, World!"
您可以在此处找到工作示例: http : //jsbin.com/aselug/2/edit
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.