Javascript-使用FileReader将二进制记录读入ArrayBuffers
我有一个二进制数据文件,其中每个Javascript-使用FileReader将二进制记录读入ArrayBuffers,javascript,html,filereader,Javascript,Html,Filereader,我有一个二进制数据文件,其中每个x字节都是一个记录,我有一些格式/掩码(不管你怎么看)来解密这些数据。就像是,short-short-int-short-float-double,诸如此类。所以我正在阅读这个文件,我最终需要使用s,但我还没到那个里。。。所以我的问题有两个方面。首先,也是最直接的,将二进制文件中的每个x字节读入ArrayBuffer的最佳方法是什么? 第二,因为我遇到了一些问题为什么在读取500kb二进制文件时,下面的脚本几乎立即填充5gb+的RAM? $('input[type
x
字节都是一个记录,我有一些格式/掩码(不管你怎么看)来解密这些数据。就像是,short-short-int-short-float-double
,诸如此类。所以我正在阅读这个文件,我最终需要使用s,但我还没到那个里。。。所以我的问题有两个方面。首先,也是最直接的,将二进制文件中的每个x
字节读入ArrayBuffer的最佳方法是什么?
第二,因为我遇到了一些问题为什么在读取500kb二进制文件时,下面的脚本几乎立即填充5gb+的RAM?
$('input[type="file"]').change(function(event) {
// FileList object
var files = event.target.files;
for (var i = 0, f; f = files[i]; i++) {
var reader = new FileReader();
// closures and magnets, how do they work
reader.onload = (function(f) {
return function(event) {
// data file starts with header XML
// indexOf +9 for </HEADER> and +1 for null byte
var data_start = event.target.result.indexOf('</HEADER>')+10,
// leverage jQuery for XML
header = $(event.target.result.slice(0,data_start)),
rec_len = parseInt(header.find('REC_LEN').text(),10);
// var ArrayBuffer
// define ArrayBufferView
// loop through records
for (var i = data_start; i<event.target.result.length; i+=rec_len) {
// fill ArrayBuffer
// add data to global data []
console.log(i+' : '+event.target.result.slice(i, i+rec_len));
}
};
})(f);
// Read as Binary
reader.readAsBinaryString(f);
}
});
$('input[type=“file”]”)。更改(函数(事件){
//文件列表对象
var files=event.target.files;
for(var i=0,f;f=files[i];i++){
var reader=new FileReader();
//封口和磁铁,它们是如何工作的
reader.onload=(函数(f){
返回函数(事件){
//数据文件以头XML开头
//indexOf+9表示空字节,indexOf+1表示空字节
var data_start=event.target.result.indexOf(“”)+10,
//利用jqueryforxml
header=$(event.target.result.slice(0,数据\u开始)),
rec_len=parseInt(header.find('rec_len').text(),10);
//阵列缓冲器
//定义ArrayBufferView
//循环浏览记录
对于(var i=data_start;i至少有几个一般提示:
使用a是灵活的,但有点慢——它应该比字符串上调用的parseInt
快,但不如数组视图快。好处是,如果二进制数据需要,它支持不同的字节顺序。使用reader.readAsArrayBuffer(f)
,然后在onload
回调中,使用
var dv = new DataView(arrayBuffer, [startCoord, [endCoord]]),
result = [];
// in some loop for i...
result[i] = [];
result[i].push(dv.getInt8(coord));
// coord += offset;
result[i].push(dv.getFloat32(coord));
// end some loop
正如我所提到的,在ArrayBuffer上创建多个会更快,但是(据我所知)不能在运行时更改光标位置——因此混合数据类型将是一个问题
要将结果放入类型化数组,只需声明类似于var col1=Uint8Array(length)的内容;
。类型化数组子类已列出。请注意,根据我的经验,类型化数组在性能方面不会给您带来太多好处。搜索类型化数组的一些jsperf测试。可能是日志记录或其他工件导致内存膨胀?ArrayBuffers应该只占用您分配的内存?行reader.onload=函数(f){返回函数(事件){…<代码>可以简化为<代码>读取器.OnLoad=函数(事件){……/>代码> BTW。您查看过FieleRADER?Read SalayBuffER(?)@我有什么,这就是我在解决方案中所用的!@ Savigg也许你应该考虑回答你自己的问题,以获得别人的利益: