【问题标题】:Javascript replace byte array sequenceJavascript替换字节数组序列
【发布时间】:2016-09-10 07:10:52
【问题描述】:

我正在尝试替换二进制文件中的一些文本。我在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");
    }
}

【问题讨论】:

  • 将您正在搜索的字节序列(即Header1)作为字节放入数组中。在您的二进制文件中,使用与搜索数组相同长度的Array.prototype.slice(index, index + searcharray.length) 创建切片。从索引 0 到 binarfile.length-searcharray.length 开始比较 Array.prototype.every() 1 个索引增量。
  • 是的,我觉得尺寸可能是前进的方向。但是,我试图替换的实际标题字符串的大小不同(对不起,我应该在我的示例中说明这一点),所以我不确定这是可能的。

标签: javascript arrays replace find


【解决方案1】:

试试这个。不久前我做了一个类似的算法,把它挖出来并为你修改。 只要 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(',') + ']';

【讨论】:

  • 谢谢乔纳森,恐怕我忽略了我试图替换的字符串不同,我已经用正确的字符串更新了我的问题。我相信这会很有用。
  • @Ke。我已经修改了我的答案,希望它现在能满足您的需求。
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2016-06-17
相关资源
最近更新 更多