Javascript替换字节数组序列

时间:2016-05-13 23:59:54

标签: javascript arrays replace find

我试图替换二进制文件中的一些文本。我将二进制文件转换为js中的字节数组,然后尝试使用我想要更改的字节序列。但是,似乎字节数组不是字符串,所以我无法替换序列。我试过toString(),这只是给了我大量的转义(例如65 /,34 /,102 /等)我也试过了join()函数,但这似乎在字节数组,它不保留数组(似乎通过添加空格来改变它,当我稍后使用base64进行编码时,这会产生很大的不同)。

我猜我可以循环遍历数组并单独更改字节,但我怎样才能在指定的序列中执行此操作?是否可以在阵列上进行查找和替换?

function read(){
    var binaryfile = readbytes('C:/binaryfile.txt');
    var replaced = binaryfile.join(" ");
    //replaced = binaryfile.toString();
    var Header1 = "67 99 110 75 0 0 0 0 70 66 67 ";
    var Header2 = "67 99 110 75 0 0 0 0 80 70 67 45 0";
    finalstring = replaced.replace(Header1, Header2);   
    alert(replaced);
}


function readbytes(s){
    var f = new File(s);
    var i,a,c;
    var d = [];
    if (f.isopen) {
        c = f.eof;
        for(i=0;i<c ;i++){ 
            a = f.readbytes(1); 
            d.push(a);
        }   
        return d;
        f.close();
    } else {
        post("could not open file: " + s + "n");
    }
}

1 个答案:

答案 0 :(得分:0)

试一试。我不久前做了一个类似的算法,挖出来并为你修改它。 只要dataFrom和dataTo长度相同(只要fileData大小不变),它就会起作用。无论大小差异如何,它都能正常工作。

var replaceBytes = function(fileData, dataFrom, dataTo) {
    var loc = 0, sz = fileData.length;
    var checksComplete = 0, totalChecks = dataFrom.length;
    while(loc < sz && checksComplete < totalChecks) {
        if(dataFrom[checksComplete] === fileData[loc++])
            checksComplete++;
        else checksComplete = 0;
        }
    if(checksComplete === totalChecks) {
        // Match found -- creates a new (regular) array to return
        Array.prototype.splice.apply(
            fileData = Array.prototype.slice.call(fileData),
            [loc - totalChecks, totalChecks].concat(dataTo)
            );
        }
    return fileData;
    };

document.body.innerText = '[' + replaceBytes(
    new Uint8Array([0,0,0,0,67,99,110,75,0,0,0,0,70,66,67,0,0,0,0]), // File data
    [67,99,110,75,0,0,0,0,70,66,67], // Byte sequence to search for
    [67,99,110,75,0,0,0,0,80,70,67,20,40,60,80] // Byte sequence to replace with
    ).join(',') + ']';

相关问题