Проблема в том, что конструктор Blob
преобразует числа в вашем массиве в строки.Согласно документации MDN конструктор Blob
принимает и массив объектов Array
или ArrayBuffer
, ArrayBufferView
, Blob
, DOMString
илисмесь любого из таких объектов, в качестве первого параметра.Все они будут объединены и помещены в Blob
.Таким образом, каждый элемент в массиве, который вы передали, обрабатывается отдельно.Они преобразуются в строки (см. Таблицу ASCII , код «1» - 49 и т. Д.) И помещаются в BLOB-объект.
Обратите внимание, что результаты этих 4 выражений одинаковы:
function arrayToBlob(data) {
return new Blob(data);
}
function blobToArray(data, callback) {
let reader = new FileReader();
reader.addEventListener("loadend", function() {
callback(Array.from(new Uint8Array(reader.result)));
});
reader.readAsArrayBuffer(data);
}
blobToArray(arrayToBlob([1,2,3]), console.log)
blobToArray(arrayToBlob(['1','2','3']), console.log)
blobToArray(arrayToBlob([123]), console.log)
blobToArray(arrayToBlob(['123']), console.log)
Если вы хотите получить двоичный массив обратно, вам нужно передать пропинговый двоичный массив в Blob
:
function arrayToBlob(data) {
return new Blob([data]);
}
function blobToArray(data, callback) {
let reader = new FileReader();
reader.addEventListener("loadend", function() {
callback(Array.from(new Uint8Array(reader.result)));
});
reader.readAsArrayBuffer(data);
}
var arr = new Uint8Array(3);
arr[0]=1;
arr[1]=2;
arr[2]=3;
blobToArray(arrayToBlob(arr), console.log)
Обратите внимание, как я передаю Uint8Array
на Blob
: return new Blob([data]);
.Я поместил его внутрь массива, чтобы он не обрабатывался как массив объектов, который Blob
принимает в качестве 1-го параметра.
В заключение: вы на самом деле не выполняли круговую передачу, вы начали с одного типа массива и преобразовали егов другой тип массива.Если вы используете массив propper с самого начала, то все работает.