【问题标题】:Writing binary data from javascript (Firefox plugin)从 javascript (Firefox 插件) 写入二进制数据
【发布时间】:2012-02-17 04:53:45
【问题描述】:

嗨:我正在编写一个 firefox 扩展(我的第一个),其中包括将图像 url 读入字节数组,然后将该二进制信息写入文件。我用过this example,看起来好像可以,但是文件不对,好像在上面进行了某种字符转换。

我的版本如下:

testWriteBinaryFile : function (dir, filename, data) {
    var aFile = Components.classes["@mozilla.org/file/local;1"].
        createInstance(Components.interfaces.nsILocalFile);

    aFile.initWithPath( "/home/mike/mypicture.gif" );
    aFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0600);
    Firebug.Console.log("Binary writing: file set up");

    var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].
                 createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate
    Firebug.Console.log("Binary writing: stream set up");

    Firebug.Console.log("Data length: " + data.length);
    Firebug.Console.log("Data byte 0: " + data[0].toString(16));
    Firebug.Console.log("Data byte 1: " + data[1].toString(16));
    Firebug.Console.log("Data byte 2: " + data[2].toString(16));
    Firebug.Console.log("Data byte 3: " + data[3].toString(16));
    Firebug.Console.log("Data byte 4: " + data[4].toString(16));

    stream.write(data, data.length);
    Firebug.Console.log("Binary writing: stream written")
    if (stream instanceof Components.interfaces.nsISafeOutputStream) {
        stream.finish();
    } else {
        stream.close();
    }
    Firebug.Console.log("Binary writing: done.");
}

通过打印前几个字节,我知道数据缓冲区本身是可以的,但是文件在磁盘上完全不同。写出二进制文件的任何想法或任何其他方法?

我知道这是一个同步写入,但文件很小(20Kb)......但这是唯一的例子。如果我能解决这个问题,我已经完成了扩展!任何和所有帮助表示赞赏。

【问题讨论】:

    标签: javascript firefox-addon


    【解决方案1】:

    您在此处拥有的代码可以正常工作 - 例如如果data"foo\0\n\rbar",则该字符串已正确写入磁盘。也许问题是nsIOutputStream.write() 需要一个字符串作为参数,但是您正在谈论一个字节数组。如果您的 data 变量确实是一个字节数组,那么首先将其转换为字符串可能是最简单的:

    data = String.fromCharCode.apply(String, data);
    

    在操作之后data是一个对应于原始字节数组的字符串,可以和nsIOutputStream.write()一起使用。更有效(但在这种情况下可能没有必要)的方法是使用nsIBinaryOutputStream,如下所示:

    Components.utils.import("resource://gre/modules/FileUtils.jsm");
    
    var stream = FileUtils.openSafeFileOutputStream(aFile, FileUtils.MODE_WRONLY |
                                                           FileUtils.MODE_CREATE);
    
    var binaryStream = Components.classes["@mozilla.org/binaryoutputstream;1"]
                                 .createInstance(Components.interfaces.nsIBinaryOutputStream);
    binaryStream.setOutputStream(stream);
    binaryStream.writeByteArray(data, data.length);
    
    FileUtils.closeSafeFileOutputStream(stream);
    

    我在这个例子中使用了FileUtils module,它让事情变得简单了很多。

    【讨论】:

    • 您的第一个解决方案运行良好。我有一种预感,需要某种转变。非常感谢您的帮助,一束鲜花即将送达! (实际上我确实先尝试了第二种解决方案,但它卡在 writeByteArray 上,我会再试一次。)
    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2015-05-06
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多