Javascript:Uint16Array(length)返回无效参数

时间:2014-10-14 21:26:57

标签: javascript file-upload filereader

我尝试读取文件,以便在将二进制数据发送到服务器之前对其执行某些操作。

在某个时刻,我试图将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不允许以这种方式接收可执行文件,是否有人知道我可以以十六进制形式访问数据的任何方式?

2 个答案:

答案 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));
}