无法在 ChromeOS 应用程序中正确保存类型化数组

Can't save a typed array in ChromeOS app correctly

我正在为 chromeOS 创建一个应用程序。问题是,当我尝试保存类型化数组时,它变得毫无意义。

例如,这是一个以十六进制格式打开的 PNG 文件Reader: check it out

现在,我尝试使用以下代码保存相同的图像:

var data = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x8D, 0x32, 0xCF, 0xBD, 0x00, 0x00, 0x00, 0x13, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0x63, 0x60, 0x60, 0x60, 0xF8, 0x4F, 0x24, 0x1E, 0x55, 0x48, 0x4F, 0x85, 0x00, 0x34, 0xBD, 0x63, 0x9D, 0x45, 0xBF, 0x95, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82]);

var blob = new Blob( data, {type:'application/octect-binary'} );

// Allow saving of our file
chrome.fileSystem.chooseEntry( {type:"saveFile"}, function (a)
{
    a.createWriter( function (b)
    {
        b.write( blob );
    });
});

但是你猜怎么着?我打开它,当我在 Hex Reader、THIS

中检查它时,它没有以 PNG 格式打开

所以问题是,什么、如何、何时、为什么? FML lmao ^.^' 一直试图保存 png 这么长时间...有一天我发誓..

Blob 构造函数定义为 new Blob( array, options ),其中 array 记录为

array is an Array of ArrayBuffer, ArrayBufferView, Blob, DOMString objects, or a > mix of any of such objects, that will be put inside the Blob.

来源:https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob

在您的示例中,您将 Uint8Array 直接传递到 blob,这令人惊讶地没有给出错误,但它确实将错误的数据放入 Blob.

试试这个

var data = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x8D, 0x32, 0xCF, 0xBD, 0x00, 0x00, 0x00, 0x13, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0x63, 0x60, 0x60, 0x60, 0xF8, 0x4F, 0x24, 0x1E, 0x55, 0x48, 0x4F, 0x85, 0x00, 0x34, 0xBD, 0x63, 0x9D, 0x45, 0xBF, 0x95, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82]);

var blob = new Blob( [data], {type:'application/octect-binary'} );

// Allow saving of our file
chrome.fileSystem.chooseEntry( {type:"saveFile"}, function (a)
{
    a.createWriter( function (b)
    {
        b.write( blob );
    });
});