2016-05-13 9 views
0

Ich versuche, ein wenig Text in einer Binärdatei zu ersetzen. Ich verwandle die Binärdatei in ein Bytearray in js und versuche dann, die Folge von Bytes zu verwenden, die ich ändern möchte. Es scheint jedoch, dass das Byte-Array keine Zeichenfolge ist, daher kann ich die Sequenz nicht ersetzen. Ich habe versucht, toString(), die mir nur eine Menge von Escaping (zB 65 /, 34 /, 102 /, etc) Ich habe auch Join() -Funktion versucht, aber das scheint Leerzeichen im Byte-Array, die behält das Array nicht bei (es scheint es zu ändern, indem Leerzeichen hinzugefügt werden, was einen großen Unterschied macht, wenn ich später mit base64 kodiere).Javascript ersetzen Byte-Array-Sequenz

Ich schätze, ich könnte nur über das Array Schleife und ändern Sie die Bytes einzeln, aber wie würde ich nur in einer bestimmten Reihenfolge tun können? Ist es möglich, ein Array zu suchen und zu ersetzen?

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

Setzen der Byte-Sequenz (d.h. Header1), die in einem Array als Bytes suchen. Erstellen Sie in Ihrer Binärdatei Slices mit 'Array.prototype.slice (index, index + searcharray.length)' gleicher Länge mit Ihrem Sucharray. Startet den Vergleich von "Array.prototype.every()" von Index 0 zu "binarfile.length-searcharray.length" mit 1 Inkrementen des Index. – Redu

+0

Ja, ich hatte das Gefühl, dass die Größe der Weg nach vorne sein könnte. Allerdings ist meine tatsächliche Header-Zeichenfolge, die ich versuche zu ersetzen, eine andere Größe (Entschuldigung, ich hätte dies in meinem Beispiel klar gemacht werden sollte), also bin ich mir nicht sicher, ob das möglich ist. –

Antwort

0

Probieren Sie es aus. Ich habe vor einiger Zeit einen ähnlichen Algorithmus erstellt, ihn ausgegraben und für Sie modifiziert. Es funktioniert, solange dataFrom und dataTo die gleiche Länge haben (solange sich die fileData-Größe nicht ändert). Es funktioniert unabhängig von Größenunterschieden.

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

Dank Jonathan, ich fürchte, ich habe weggelassen, dass die Saiten anders sind, dass ich versuche zu ersetzen, habe ich meine Frage mit den richtigen Saiten aktualisiert. Ich bin mir sicher, dass dies nützlich sein wird. –

+0

@Ke. Ich habe meine Antwort so geändert, dass sie jetzt hoffentlich Ihren Bedürfnissen entspricht. –