2016-04-07 14 views
0

Ich habe ein Uint8Array mit einem Offset, das ich von einer anderen Funktion erhalte. Dies enthält die Daten, die ich brauche, aber es gibt ein paar andere Sachen am Anfang des Puffers, der dieses typisierte Array unterstützt.Wie kann ich ein Uint8Array mit Offset in ein Int32Array konvertieren?

Die tatsächlichen Daten sind 32bit Ganzzahlen, und ich möchte diese Daten in einem Int32Array haben. Aber diese Umwandlung scheint nicht einfach zu sein, ich mache es zur Zeit manuell die folgende Art und Weise:

var outputBuffer = new ArrayBuffer(data.length); 
    var inputByteArray = new Uint8Array(outputBuffer); 
    for (var i=0; i < data.length; ++i) { 
    inputByteArray[i] = data[i] 
    } 
    var outputInt32Array= new Int32Array(outputBuffer); 

Die einfache Art und Weise der gerade einen neuen Int32Array zu schaffen und das Bestehen der Quelle Uint8Array nicht funktioniert:

Dies führt zu einem typisierten Array, das sich immer noch wie ein Uint8Array verhält und einzelne Bytes ausgibt, keine 32-Bit-Ganzzahlen.

es, indem man in der Offset auch ich den Fehler nicht funktioniert Versuch bekommen „Auslöser Range: von Int32Array Start-Offset sollte ein Vielfaches von 4 sein“:

var outputInt32Array = new Int32Array(data.buffer, data.byteOffset, length) 

jedes Byte Kopieren ist die einzige Möglichkeit, ein Int32Array aus einem Int8Array mit einem Offset zu bekommen?

+0

Btw, wenn Sie 'neues Int32Array (Daten)' tun, liest es jedes 'Uint8' von' Daten' in ein 'Int32', d. H. Vervierfacht die Größe des Puffers. – Bergi

Antwort

3

Nein, Sie müssen die Bytes nicht manuell von einem zum anderen Array kopieren. Verwenden Sie new Int32Array(data.buffer, …) ist der beste Ansatz, aber wenn Sie einen seltsamen Offset haben, müssen Sie einen zweiten Puffer verwenden, der ordnungsgemäß ausgerichtet ist. Trotzdem müssen Sie nicht manuell kopieren, können Sie einfach die slice method verwenden:

var outputInt32Array = new Int32Array(data.buffer.slice(data.byteOffset), 0, length); 

Wenn Sie int32s auf dem gleichen Puffer wie data zugreifen müssen, können Sie auch eine DataView verwenden können.