2013-04-05 93 views
3

我有一个数组,每个数据单元可以保留4个字节(2 ** 32)。这个数组展示了我用JS编写的虚拟机的内存。我也有字符串。只有一个地方我可以保留这个字符串 - 我上面描述的内存。在JavaScript中将字符串转换为整数数组,反之亦然

我决定在内存中以字符串的形式呈现字符串(特殊符号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字符串构建十六进制字符串。我认为可以用位操作和面具来做,但我不知道,如何。也许我错了。

回答

1

下面是转换字符串使用口罩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

+0

真棒,正是我所想!谢谢。 – bsiamionau 2013-04-05 12:14:46

相关问题