我试图替换二进制文件中的一些文本。我将二进制文件转换为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");
}
}
答案 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(',') + ']';