BERT.JS

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.