我尝试读取文件,以便在将二进制数据发送到服务器之前对其执行某些操作。
在某个时刻,我试图将FileReader.readAsArrayBuffer()返回的数据转换为Uint16Array()。但是,在这样做时,分配数组的代码将失败:'错误:无效的参数'。我需要数据是一个表示整个二进制文件的十六进制字符串。
这是我使用的代码:
function HexToHexString(ByteBuffer)
{
//Similar constructs like: 'var Array = new Uint16Array(ByteBuffer);' also fail
var View = new DataView(ByteBuffer);
var Array = new Uint16Array((ByteBuffer.byteLength / 2)); // <- this line fails
for(var i = 0; i < Array.length; i++)
{
Array[i] = View.getUint16(i*2);
}
return String.fromCharCode.apply(null, Array);
}
function OnReadFileCompletion(FileReadEvent)
{
if(FileReadEvent.target.readyState == FileReader.DONE)
{
// Debug code, will be replaced:
document.getElementById('byte_content').textContent = HexToHexString(FileReadEvent.target.result);
//FileReadEvent.target.result;
}
}
function ReadFile(File, ResultFunction)
{
var Reader = new FileReader();
Reader.onloadend = ResultFunction;
Reader.readAsArrayBuffer(File.slice(0, File.size - 1));
}
File是一个文件对象,ResultFunction是OnReadFileCompletion(),ByteBuffer是一个&#39; [object ArrayBuffer]&#39;。
当我输出ArrayBuffer的大小时,它匹配文件的大小(82kb)。我在firefox 32上没有安装插件。
我不是javascript程序员,有谁知道我做错了什么?
EDIT1:
似乎与我尝试阅读的文件大小有关,使用1kb文本文件似乎可以正常工作,而82kb二进制文件则没有。
EDIT2
我说得太早了,也许它与文件类型有关。 200kb的图像文件有效,而82的可执行文件没有。
似乎javascript不允许以这种方式接收可执行文件,是否有人知道我可以以十六进制形式访问数据的任何方式?
答案 0 :(得分:0)
尝试使用.length而不是byteLength
答案 1 :(得分:0)
我已经破解了适用于我的代码,我不知道为什么这样做或者我在其他时间做错了什么。但它的确有效。
function ApplyPadding(Number, PaddingLength)
{
var s = Number + "";
while (s.length < PaddingLength)
s = "0" + s;
return s;
}
function HexToHexString(ByteBuffers)
{
var AnArray = new Uint8Array(ByteBuffers);
var Result = "";
for(var i = 0; i < AnArray.length; i++)
{
if(i%2==0)
Result += ApplyPadding(AnArray[i].toString(16), 2);
}
return Result;
}
function HexStringToHex(aString)
{
var Buffer = new ArrayBuffer(aString.length*2); // 2 bytes for each char
var BufferView = new Uint16Array(Buffer);
for (var i = 0;i < aString.length; i++)
{
BufferView[i] = aString.charCodeAt(i);
}
return Buffer;
}
function OnReadFileCompletion(FileReadEvent)
{
if(FileReadEvent.target.readyState == FileReader.DONE)
{
//document.getElementById('byte_content').textContent =FileReadEvent.target.result;
var DataOfFile = HexStringToHex(FileReadEvent.target.result);
var FinalData = HexToHexString(DataOfFile);
document.getElementById('byte_content').textContent = FinalData;
//FileReadEvent.target.result;
}
}
function ReadFile(File, ResultFunction)
{
var Reader = new FileReader();
Reader.onloadend = ResultFunction;
Reader.readAsBinaryString(File.slice(0, File.size - 1));
}