Javascript 使用uint8和uint16阵列读取图像作为阵列缓冲

Javascript 使用uint8和uint16阵列读取图像作为阵列缓冲,javascript,filereader,fileapi,unsigned-integer,Javascript,Filereader,Fileapi,Unsigned Integer,下面是一段代码,通过检查所需的幻数来检查上传的图像mime类型(我仍然不清楚它们)。当我将blob文件提供给uint8Array时,它工作,数组填充。但是如果我使用uint16数组,它会给出一个错误。这个错误的原因可能是什么。它说的是无效的论点 关于这个话题,我有两个问题 1。为什么不能使用UINT16阵列代替UINT8阵列? 2。我读维基百科。但是它包含了很多技术性的东西。你能解释一下“神奇数字”吗?这样我就能明白它到底是什么(简而言之) 此处不能使用UINT16数组,因为该文件的字节数为奇

下面是一段代码,通过检查所需的幻数来检查上传的图像mime类型(我仍然不清楚它们)。当我将blob文件提供给uint8Array时,它工作,数组填充。但是如果我使用uint16数组,它会给出一个错误。这个错误的原因可能是什么。它说的是无效的论点

关于这个话题,我有两个问题

1。为什么不能使用UINT16阵列代替UINT8阵列?

2。我读维基百科。但是它包含了很多技术性的东西。你能解释一下“神奇数字”吗?这样我就能明白它到底是什么(简而言之)

  • 此处不能使用UINT16数组,因为该文件的字节数为奇数。根据定义,UINT16数组需要偶数字节(2的倍数)

    而且,我也不太确定它会起什么作用。Unit16Array以平台字节顺序读取数据,这将导致不同的结果,具体取决于平台。你完全可以用字节检查一个神奇的数字

  • 幻数只是一个给定位置(通常在文件的最开始)的字节序列,它允许人们识别文件类型。当然,存在幻数不足以使文件成为公认格式的有效文件,但如果没有幻数,则明确排除了所需类型的文件(对于包含幻数的文件类型,并非所有文件都是如此)

  • 此处不能使用UINT16数组,因为该文件的字节数为奇数。根据定义,UINT16数组需要偶数字节(2的倍数)

    而且,我也不太确定它会起什么作用。Unit16Array以平台字节顺序读取数据,这将导致不同的结果,具体取决于平台。你完全可以用字节检查一个神奇的数字

  • 幻数只是一个给定位置(通常在文件的最开始)的字节序列,它允许人们识别文件类型。当然,存在幻数不足以使文件成为公认格式的有效文件,但如果没有幻数,则明确排除了所需类型的文件(对于包含幻数的文件类型,并非所有文件都是如此)


  • 谢谢你的回复。我没有发现任何声称uint16需要奇数字节的东西。你能提供我可以读取它的源代码吗myself@AL-不,它不需要奇数字节,恰恰相反。它如何处理奇数个字节?最后一个怎么办?我不确定它在任何地方都有明确的文档记录,但是您可以进行测试:
    console.log(新的Uint16Array(新的ArrayBuffer(16))(工作)
    console.log(新的Uint16Array(新的ArrayBuffer(17))(不)谢谢您的回复。我没有发现任何声称uint16需要奇数字节的东西。你能提供我可以读取它的源代码吗myself@AL-不,它不需要奇数字节,恰恰相反。它如何处理奇数个字节?最后一个怎么办?我不确定它在任何地方都有明确的文档记录,但是您可以进行测试:
    console.log(新的Uint16Array(新的ArrayBuffer(16))(工作)
    console.log(新的Uint16Array(新的ArrayBuffer(17))(没有)
    
    var upload=document.getElementById('upload');
    upload.addEventListener('change',function(e){
    
    
    
        if(window.File && window.FileReader &&  window.FileList){
    
                        var file=e.target.files[0];
                        console.log(file.type);
    
                        var fileReader=new FileReader();
    
                        fileReader.onload= function(e){
                                 var arr = (new Uint8Array(e.target.result));
    
                                 console.log(arr);
                                 var arr2=(new Uint16Array(e.target.result));
                                 console.log(arr2);
    
                        };
                 fileReader.readAsArrayBuffer(file);
                 }else{
                     alert('file api not compatible with your browser');
                 }  
    
        });