如何在Opera中从Javascript访问8位二进制数据?

如何在Opera中从Javascript访问8位二进制数据?,javascript,xmlhttprequest,opera,xmlhttprequest-level2,Javascript,Xmlhttprequest,Opera,Xmlhttprequest Level2,此问题是Opera 12浏览器的扩展 根本问题是如何处理kmz(压缩的kml)文件 二进制数据正在以 二进制文件传输后,在Opera 12中未正确填充Uint8Array,就好像数据是作为16位元素导入的一样 请求的配置如下所示: this.req.responseType = 'arraybuffer'; this.req.overrideMimeType('text/plain; charset=x-user-defined'); var fileContents = binStream

此问题是Opera 12浏览器的扩展

根本问题是如何处理kmz(压缩的kml)文件

二进制数据正在以

二进制文件传输后,在Opera 12中未正确填充Uint8Array,就好像数据是作为16位元素导入的一样

请求的配置如下所示:

this.req.responseType = 'arraybuffer';
this.req.overrideMimeType('text/plain; charset=x-user-defined');
var fileContents = binStream.req.response;
binStream.length = fileContents.byteLength;
binStream.array = new Uint8Array(fileContents);
返回的值的处理方式如下:

this.req.responseType = 'arraybuffer';
this.req.overrideMimeType('text/plain; charset=x-user-defined');
var fileContents = binStream.req.response;
binStream.length = fileContents.byteLength;
binStream.array = new Uint8Array(fileContents);
在Opera 12中,前八个字节的填充方式如下:

0x004B0050;给出一个4915280的十进制值

但应该是:

0x4034B50;十进制值67324752

这在Firefox、Chrome和IE中正常工作(有一个解决方法)

有人知道我如何说服Opera 12正确填充UINT8阵列吗?或者一种解决方法,使其能够工作(某种方式将16位字节的数组转换为8位字节的数组,尽可能高效地丢弃不需要的上8位)?这是Opera 12中TypedArray/XmlHttpRequest的最新实现中的一个已知错误吗?

此“补丁”可以工作:

var fileContents=binStream.req.response;
binStream.length=fileContents.bytellength;
binStream.array=新的Uint8Array(fileContents);
/*歌剧补丁*/
if(/opera/i.test(navigator.userAgent)和
//确保它仍然是坏的,
//前4个字节将包含zip文件签名
//对于geoxml3用例(因此字节1和3将不为0)
(binStream.array[1]==0)和&(binStream.array[3]==0))
{    
fixedArray=新的UINT8阵列(binStream.length/2);

对于(var i=0;iOpera 12.00,引入了对
responseType
的支持;不幸的是,其中有一个bug,这意味着给定
text/*
MIME类型,您将以16位字结束文件。它在12.01中得到修复,但最简单的修复方法是将覆盖类型设置为
application/octet stream
。(这是CORE-46938,适用于那些希望跟踪关闭的bug跟踪器的人。)

将MIME类型设置为application/octet stream确实解决了Opera 12中的问题(我一定是第一次在错误的位置更改了它,我将删除表示它不起作用的注释)。这就是我更改的:This.req.overrideMetype('application/octet stream;charset=x-user-defined');@geocodezip有关12.01版本,请参阅or。发布日期未知。