ArrayBuffer oder Uint8Array
bearbeitet von
hi Jörg, serverseitig sieht das so aus:
~~~
use bytes;
# Kleinste atomare Einheit
sub val2bs{
my $val = shift;
return pack('NC',0,0) if ! defined $val;
state %cache;
return $cache{$val} ? $cache{$val} : do{
my $bs = pack('NC', length($val), 1).$val;
$cache{$val} = $bs;
$bs;
};
}
~~~
Das erzeugt eine bin.Sequenz, die z.B. per AJAX als ArrayBuffer angefordert wird. Je nachdem, wie die Atome zusammengesetzt sind, kannst Du Arrays, Hashes oder Hashes of Hashes erzeugen, was daraus wird, entscheidet nur der Algorithmus. in der Binsequenz ist also als BigEndian 'N', kodiert, wie lang die Bytefolge ist und in einem Byte 'C' steht drin, ob der Wert undef (Perl) oder null (JS) ist.
Untenstehend JS was ich vor einiger Zeit mal schrieb, das möchte ich vereinfachen:
~~~
var bSerialize = {
/* ArrayBuffer to Attribute=Value (Object) */
bs2av: function(buffer, raw){
var arr = this.bs2array(buffer, true);
var av = {};
var att = '';
while( att = arr.shift() ){
var val = arr.shift();
av[new StringView(att)] = raw != null ? val : new StringView(val);
}
return av;
},
/* ArrayBuffer to Array */
bs2array: function(buffer, raw){
var array = [];
this.uha = new Uint8Array(buffer.byteLength);
this.uha.set( new Uint8Array(buffer), 0);
this.chunk = new Uint8Array(0);
this.shift = function(bytes){
this.chunk = this.uha.subarray(0, bytes);
this.uha = this.uha.subarray(bytes);
return(this.uha.length);
};
while(this.shift(5)){
var lenbuffer = new ArrayBuffer(5);
var dv = new DataView(lenbuffer);
for(var i = 0; i < 5; i++){ dv.setUint8(i, this.chunk[i]); }
var vlen = dv.getUint32(0,0); /* Länge des Array-Element in Bytes */
var type = dv.getUint8(4,0); /* Ist ArrayElement definiert oder nicht */
this.shift(vlen);
var vbuffer = new ArrayBuffer(vlen);
dv = new DataView(vbuffer);
for(var i = 0; i < vlen; i++) dv.setUint8(i, this.chunk[i]);
var val = raw != null ? vbuffer : new StringView(vbuffer);
array.push(val);
}
return array;
}
};
~~~
Ich werd mir mal Array.slice() angucken. Evntl. ists damit zweckmäßiger, sich durch einen ArrayBuffer oder Uint8Array zu bewegen. pl