繁体   English   中英

Javascript替换字节数组序列

[英]Javascript replace byte array sequence

我正在尝试替换二进制文件中的一些文本。 我将二进制文件转换为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");
    }
}

试试看 不久前,我做了一个类似的算法,将其挖掘出来并为您修改。 只要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(',') + ']'; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM