2016-05-13 27 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。我已經修改了我的答案,希望它現在適合您的需求。 –