2016-05-13 16 views
0

バイナリファイル内のテキストの一部を置き換えようとしています。バイナリファイルをjsのバイト配列に変換し、変更したいバイトシーケンスを使用しようとします。しかし、バイト配列は文字列ではないようですので、シーケンスを置き換えることはできません。私はtoString()を試してみましたが、私は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。私は自分の答えを変更しましたので、うまくいけば今はあなたのニーズに合っています。 –

関連する問題