2014-10-14 1 views
0

서버로 보내기 전에 바이너리 데이터에 대한 특정 작업을 수행하기 위해 파일을 읽으려고합니다.자바 스크립트 : Uint16Array (길이)가 잘못된 인수를 반환합니다.

특정 시점에서 FileReader.readAsArrayBuffer()에 의해 반환 된 데이터를 Uint16Array()로 변환하려고합니다. 그러나 이렇게하면 배열을 할당하는 코드가 실패합니다 : 'Error : invalid arguments'. 데이터가 전체 바이너리를 나타내는 16 진수 문자열이어야합니다.

내가 사용하고 코드입니다 :

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

파일이 파일 객체가, ResultFunction는의 ByteBuffer는 '[객체 ArrayBuffer은]입니다 OnReadFileCompletion()입니다.

ArrayBuffer의 크기를 출력 할 때 파일 크기 (82kb)와 일치합니다. 파이어 폭스 32에 플러그인이 설치되어 있지 않습니다.

저는 자바 스크립트 프로그래머가 아니며, 내가 뭘 잘못하고 있는지 알 수 있습니까?

EDIT1가 :

1킬로바이트 텍스트 파일이 82킬로바이트 이진 파일하지 않는 동안 작업을 표시하여, 내가 읽은하기 위해 노력하고있어 파일의 크기에 할 일 무언가가 보인다.

Edit2가

나는 아마도 그것은 파일 형식 함께 할 수있는 뭔가가, 너무 빨리 말했다. 200kb의 이미지 파일은 작동하지만 82의 실행 파일은 작동하지 않습니다.

javascript가 실행 파일에이 방법으로 액세스 할 수 없도록하는 것으로 보입니다. 아무도 16 진수 형식의 데이터에 액세스 할 수있는 방법을 알지 못합니다.

답변

0

시도 대신에 내가 함께 해킹 나를 위해 작동 코드를 한 ByteLength가

+0

아무런 변화가 없지만 여전히 오류를 반환합니다. – user513647

+0

정확한 메시지를 붙여 넣을 수 있습니까? nvm - 당신이 게시물을 다시 읽었습니다. 이제 –

+1

을 보았습니다. Uint16Array를 생성자로 전달하고 ArrayBuffer를 인스턴스화하는 것이 가능해야합니다. 시도해 보셨습니까? –

0

, 나는이 작동하는 이유를 모르거나 내가 잘못 다른 시간을했다하지 않는 .length 사용. 그러나 그것은 효과적이다.

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