Na MDN można znaleźć przegląd wszystkich dostępnych ArrayBufferView
podklasy:
Type | Size | Description | Equivalent C type
-------------+------+---------------------------------------+------------------
Int8Array | 1 | 8-bit twos complement signed integer | signed char
Uint8Array | 1 | 8-bit unsigned integer | unsigned char
Int16Array | 2 | 16-bit twos complement signed integer | short
Uint16Array | 2 | 16-bit unsigned integer | unsigned short
Int32Array | 4 | 32-bit twos complement signed integer | int
Uint32Array | 4 | 32-bit unsigned integer | unsigned int
Float32Array | 4 | 32-bit IEEE floating point number | float
Float64Array | 8 | 64-bit IEEE floating point number | double
Zasadniczo, można znaleźć miejsca, co pamięć każdy element tablicy zajmie i czy jest to zwykły numer lub numer FP. Nie mam pewności, jakie języki znasz, ale jeśli obejmuje to także język Java, jest to zasadniczo taki sam wybór, jak w przypadku opcji byte[]
, short[]
, int[]
, float[]
i double[]
(Java jest zawsze podpisana, dzięki czemu część nie ma znaczenia).
Wiemy, dane binarne, takie jak obrazy, są zwykle reprezentowane jako tablica bajtów. Może to być również tablica krótka/int/long, ale jest to marnowanie przestrzeni pamięci. Jeśli chciałbyś zapisać obraz o wielkości 100 KB (zwróć uwagę, że "B" oznacza bajt, czyli 8 bitów) w tablicy int, zamiast tablicy bajtów, wówczas zajmowałby on 400 KB pamięci, co jest marnowaniem 300 KB. Najmniejszy, Int8Array
, wystarczyłby już w odniesieniu do przestrzeni pamięci. Gdybyś kiedykolwiek chciał programowo przemierzać go — co jest bardzo mało prawdopodobne w tym przypadku — jako unsigned tablicy, to może zdecydować się na Uint8Array
zamiast gdzie każda pozycja posiada wartości 0
do 255
zamiast wartości -128
do 127
.
Oto przykład kopiowania i kopiowania, który umożliwia pobranie pliku obrazu z serwera, zapisanie go w tymczasowej lokalnej pamięci i wyświetlenie go jako obiektu <img>
w ciele (wymagany jest mały jQuery) część). W tym przykładzie założono, że plik image.png
znajduje się w tym samym folderze bazowej jako JS (lub HTML, w przypadku JS jest inlined) plik został pobrany z:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 1024*1024, startDownload, errorHandler);
var errorHandler = function(error) {
console.log('FS error: ' + error);
}
var xhr = new XMLHttpRequest();
xhr.open('GET', 'image.png', true);
xhr.responseType = 'arraybuffer';
function startDownload(fileSystem) {
xhr.onload = function(event) {
var content = new Int8Array(this.response);
fileSystem.root.getFile('/image.png', { 'create': true }, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(event) {
$('body').append('<p>Image successfully downloaded:</p>')
.append('<p><img src="' + fileEntry.toURL() + '"/></p>');
};
var blob = new Blob([content], { type: 'image/png' });
fileWriter.write(blob);
}, errorHandler);
});
}
xhr.send();
}
Note, jako państwa current to działa tylko w Chrome.
Co z wykorzystaniem JSON? –