不能在ChromeOS应用程序中正确保存类型数组

Can't save a typed array in ChromeOS app correctly

本文关键字:确保 保存 类型 数组 ChromeOS 应用程序 不能      更新时间:2023-09-26

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

例如,下面是一个用HexReader打开的PNG文件:检查一下

现在,我尝试使用以下代码保存相同的图像:
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 );
    });
});

但是你猜怎么着?我打开它,它不是以PNG格式打开的,当我在十六进制阅读器中检查它时,THIS

所以问题是,什么,怎样,何时,为什么?FML哈哈哈哈一直试图保存png这么长时间…

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

arrayArrayBufferArrayBufferViewBlobDOMString对象中的Array,或者是这些对象的一个>混合,它们将被放入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 );
    });
});