2016-05-13 50 views
0

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

我猜我可以循环遍历数组并单独更改字节,但是如何才能在指定的序列内完成这些操作?是否有可能在数组上进行查找和替换?

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"); 
    } 
} 
+0

把字节序列(即头1),您在阵列中以字节为单位进行搜索。在你的二进制文件中使用与你的搜索数组相同长度的'Array.prototype.slice(index,index + searcharray.length)'创建切片。从索引0开始将'Array.prototype.every()'与binarfile.length-searcharray.length比较两次,索引增量为1。 – Redu

+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(',') + ']';

+0

谢谢乔纳森,恐怕我省略了字符串不同,我试图替换,我更新了我的问题与正确的字符串。我确定这将会有用。 –

+0

@Ke。我已经修改了我的答案,希望它现在适合您的需求。 –