2015-12-11 10 views
1

Вот кусок кода, чтобы проверить закачанный тип изображения мима, проверяя желаемый магического число (я до сих пор не понимаю их ясно пока). когда я поставляю файл blob в uint8Array, он работает, массив заполняется. Но если я использую uint16array, он дает ошибку. В чем причина этой ошибки. В нем указан недопустимый аргумент.чтения изображения ArrayBuffer с помощью Uint8 и UInt16 массива

У меня есть два вопроса по этой теме.

1. Почему я не могу использовать uint16array вместо uint8array?

2. Я читал википедию. Но он содержит много технических материалов. Можете ли вы пролить свет на «магическое число», так что я могу понять, что это на самом деле (в двух словах)

enter image description here

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

    }); 

ответ

0
  1. Вы не можете использовать Uint16Array здесь, потому что файл имеет нечетное количество байтов. По окончательному, Uint16Array нуждается в четном числе байтов (кратное 2).

    Кроме того, я не совсем уверен, какую цель он будет выполнять. Unit16Array считывает данные в порядке байтов платформы, что приведет к разным результатам в зависимости от платформы. И вы можете определенно проверить магическое число с байтами.

  2. Магическое число - это просто последовательность байтов в определенном месте (часто в самом начале файла), что позволяет распознавать тип файла. Конечно, присутствие магического числа недостаточно, чтобы сделать файл допустимым файлом для распознанного формата, но его отсутствие определенно исключает файл требуемого типа (для типов файлов, которые включают магическое число, которое не является обязательно для всех их).

+0

благодарит за ответ. я не нашел ничего, которые утверждают, что uint16 требует нечетное количество байтов. Вы можете указать любой источник, где я могу его прочитать самостоятельно –

+0

@ AL-zami Нет, это не требует нечетного количества байтов, совершенно наоборот. Как он мог обрабатывать нечетное количество байтов? Что будет с последним? Я не уверен, что это где-то документально, но вы можете сделать тест: 'console.log (новый Uint16Array (новый ArrayBuffer (16)));' (works) 'console.log (новый Uint16Array (новый ArrayBuffer (17))); '(не) – jcaron