Einleitung
Das bert.js Modul stellt JavaScript-Encoder / Decoder für Erlang's External Term Format zur Verfügung. Das bedeutet, dass Ihre JavaScript-Anwendungen in Erlang's Sprache mit Erlang Anwendungen kommunizieren können. Dieses Modul nutzt dazu Dataview und getUint8, getUInt16, und getUInt32 Wort Accessoren, was der schnellste Weg für den Umgang mit Binärdateien in JavaScript ist. Die Bibliothek wird sowohl in Erang als auch Haskell N2O-Versionen verwendet. Die Größe von bert.js ist 4654 Bytes.
Beachten Sie, dass es sich bei dieser Library um eine schnelle Low-Level Version des BERT-Encoders/Decoders handelt. Wenn Sie eine JavaScript-SDK mit Feldnamen wie in Erlang's Include-Dateien generieren möchten, nehmen Sie bitte BERT als High-Level-Gegenstück-Bibliothek, die Wrapper um bert.js erzeugt und ein besseres JavaScript-Erlebnis bietet.
Erlang-Struktur, die ins BERT-Format kompiliert:
#io{ code = login,
data = { 'Token', 42 } }
Zielstruktur von bert.js — dem schnellen Low-Level-Parser des BERT Formats.
{ t: 104,
v: [ { t: 100, v: "io" },
{ t: 100, v: "login" },
{ t: 104, v: [ { t: 100, v: "Token" },
{ t: 97, v: 42 } ] } ] }
Zielstruktur des erzeugten Parsers durch BERT parse transform:
{ tup: 'io',
code: 'login',
data: { tup: '$',
0: 'Token',
1: 42 } },
Diese praktische Untergruppen werden vom BERT-Format unterstützt:
70
IEEE-754 float encoding. Ein Float-Wert wird als 8 Bytes im Big-Endian-IEEE-Format gespeichert. Dieser Term wird in der kleineren Version 1 des externen Formats verwendet.
1 8
70 IEEE-754 float
97
Byte-Codierung. Vorzeichenloser 8-Bit-Integer.
1 1
97 Int
98
Ganzzahl/Integer-Codierung. 32-Bit-Integer im Big-Endian-Format.
1 4
98 Int
99
Float POSIX-Codierung. Ein Float wird im String-Format gespeichert. Das verwendete Format, das in sprintf benutzt wird um den Float zu formattieren ist "%.20e" (es werden mehr Bytes zugeteilt, als notwendig). Um den Float zu entpacken, verwenden Sie sscanf mit Format "%lf".
1 31
99 Float POSIX string.
100
Atom-Codierung. Ein Atom ist mit einer 2-Byte-Länge ohne Vorzeichen in Big-Endian-Ordnung gespeichert, gefolgt von N-Zahlen von 8-Bit-Latin-1 Zeichen, die die Namen bilden. Der maximal zulässige Wert für Len ist 255.
1 2 N
100 N Characters
104
Tuple-Codierung. Das Arity Feld ist ein Byte N ohne Vorzeichen, der bestimmt, wie viele Elemente, in Abschnittselementen folgen.
1 1 N
104 N Elements
105
Große Tuple-Codierung. Gleichwie 104, außer, dass N ein 4 Byte-Integer ohne Vorzeichen in Big-Endian-Format ist.
1 4 N
105 N Elements
106
Nil.
1
106
107
String-Codierung. Weil Feld N eine 2-Byte-Integer ohne Vorzeichen ist (big-endian), müssen Implementationen sicherstellen, dass Listen, die länger mehr als 65535 Elemente haben als 108 codiert werden müssen.
1 2 N
107 N Characters
108
List-Codierung. N ist die Anzahl der Elemente, die in Abschnitt Zeichen folgen. Tail ist das endgültige Ende der Liste; es ist 106 für eine richtige Liste, kann aber von jedem Typ sein, wenn die Liste ungeeignet ist (zum Beispiel [a | b]).
1 4 N
108 N Characters Tail
109
Binäre-Codierung. Binärdateien werden mit Bit-Syntaxausdruck erzeugt, oder mit erlang:list_to_binary/1, erlang:term_to_binary/1 oder als Input von binären Ports. Das N-Längenfeld ist ein 4-Byte-Integer, ohne Vorzeichen (big-endian).
1 4 N
109 N Bytes
110
Small-Bignum-Codierung. Bignums werden in einstelliger Form mit einem Sign-Byte gespeichert, das heißt, 0, wenn die Binum positiv ist, und 1, wenn sie negativ ist. Die Ziffern mit dem niedrigstwertigen Byte werden zuerst gespeichert. Um die ganze Zahl zu berechnen, kann die folgende Formel verwendet werden:
1 1 1 n
110 n Sign d(0)...d(n-1)
B = 256,
d0*B0
+ d1*B1
+ d2*B2
+ ... dN-1*B(n-1)
111
Large-Bignum-Codierung. Gleiche wie 110, außer dass das Längenfeld eine 4-Byte-Integer ohne Vorzeichen ist.
1 4 1 n
111 n Sign d(0)...d(n-1)
115
Small-Atom-Codierung. Ein Atom wird als 1-Byte-Länge ohne Vorzeichen gespeichert, gefolgt von einer Anzahl an N 8-Bit Latin-1 Buchstaben.
1 1 N
115 N Characters
116
Maps-Codierung. Das N-Feld ist ein 4-Byte-Integer ohne Vorzeichen im Big-Endian-Format, das die Anzahl der Key-Value Paare in der Map bestimmt. Key und Value Paare (Ki => Vi) werden in Abschnittsparen in der folgenden Reihenfolge codiert: K1, V1, K2, V2, ..., Kn, V,. Duplizierte Keys sind nicht erlaubt innerhalb der gleichen Map. Erforder OTP 17.
1 4 N
116 N K1,V1,K2,V2,...
118
UTF-8-Atom-Codierung. Ein Atom ist als 2-Byte-Länge ohne Vorzeichen in Big-Endian-Ordnung gespeichert, gefolgt von N Bytes die Zeichen in UTF-8 codiert.
1 2 N
118 N Characters
119
UTF-8-Small-Atom Codierung. Ein Atom ist als 1-Byte-Länge ohne Vorzeichen gespeichert, gefolgt von N Bytes, die die Buchstaben im UTF-8 Format enthalten. Längere atome im UTF-8 Format können mit 118 dargestellt werden.
1 1 N
119 N Characters
API
enc(json)
Codierte interne JSON Binärbuffer.
> enc({t: 119, v: "日本"})
Uint8Array([131,119,6,230,151,165,230,156,172])
dec(buffer)
Dekodier Binärbuffer zu internem JSON.
> dec((new Uint8Array([131,119,6,230,151,165,230,156,172])).buffer)
{t: 119, v: "日本"}
bin(x)
> dec(enc(bin('N2O,')).buffer))
{t: 109, v: "N2O,"}
[131,109,0,0,0,4,78,50,79,44]
Erzeugt JSON für Binärkodierung.
atom(x)
Erzeugt JSON für Latin-1 Atom Codierung.
> dec(enc(atom('ok')).buffer))
{t: 100, v: "ok"}
[131,100,0,2,111,107]
string(x)
Erzeugt JSON für String-Codierung.
> dec(enc(string('ok')).buffer))
{t: 107, v: "ok"}
[131,107,0,2,111,107]
float(x)
Erzeugt JSON für IEEE-754 float Codierung.
> dec(enc(float('123.13')).buffer)
{t: 70, v: 123.13}
[131,70,64,94,200,81,235,133,30,184]
number(x)
Erstellt JSON für Integer und GMP Big-Integer Codierung.
> dec(enc(number('1')).buffer)
{t: 97, v: 1}
[131,97,1]
> dec(enc(number('100000000')).buffer)
{t: 98, v: 100000000}
[131,98,5,245,225,0]
> dec(enc(number('10000000000000000000000')).buffer)
{t: 110, v: 1e+22}
[131,110,10,0,0,0,64,178,186,201,224,25,30,2]
list(x,...)
Erzeugt JSON für List-Codierung
> dec(enc(list(atom('1'),number('1'),bin('1'))).buffer)
{t: 108, v: [{t: 100, v: "1"},
{t: 97, v: 1},
{t: 109, v: "1"}]}
[131,108,0,0,0,3,100,0,1,49,97,1,109,0,0,0,1,49,106]
tuple(x,...)
Erzeugt JSON für Tuple-Codierung
> dec(enc(tuple(atom('1'),number('1'),bin('1'))).buffer)
{t: 104, v: [{t: 100, v: "1"},
{t: 97, v: 1},
{t: 109, v: "1"}]}
[131,104,3,100,0,1,49,97,1,109,0,0,0,1,49]
map(x,...)
Erzeugt JSON für Map-Codierung
> dec(enc(map(
{k:bin('rent'),v:float(1.2)},
{k:atom('ok'), v:list(number(1),float(1.0),bin('1'))})).buffer)
{t:116, v:[{k:{t:109,v:"rent"},v:{t:70, v:1.2}},
{k:{t:100,v:"ok"}, v:{t:108,v:[{t:97, v:1},
{t:70, v:1},
{t:109,v:"1"}]}}]}
[131,116,0,0,0,2,109,0,0,0,4,114,101,110,
116,70,63,243,51,51,51,51,51,51,100,0,2,
111,107,108,0,0,0,3,97,1,70,63,240,0,0,0,
0,0,0,109,0,0,0,1,49,106]
Siehe auch: utf8.js, ieee754.js, heart.js, nitro.js, mq.js, n2o.js.