構造化されたデータを表現する方法のひとつ、ASN.1(エーエスエヌワン)を知る。(参考、
速度を極めるならバイナリ!Protocol Buffers、pbf、地理院地図VectorのESモジュール対応)
「code4fukui/ASN1: ASN.1 Decoder/Encoder/DSL」
Node.jsのモジュール「asn1.js」をブラウザやDeno用に「ASN1」として移植完了。
使い方は、下記のようにプログラムで型 Human をまず定義
import * as asn from "https://code4fukui.github.io/ASN1/lib/asn1.js";
const Bio = asn.define('Bio', function() {
this.seq().obj(
this.key('time').gentime(),
this.key('description').octstr()
);
});
const Human = asn.define('Human', function() {
this.seq().obj(
this.key('firstName').octstr(),
this.key('lastName').octstr(),
this.key('age').int(),
this.key('gender').enum({ 0: 'male', 1: 'female' }),
this.key('bio').seqof(Bio)
);
});
続いて、ASN.1を使ってバイナリ形式に変換
const output = Human.encode({
firstName: 'Thomas',
lastName: 'Anderson',
age: 28,
gender: 'male',
bio: [
{
time: +new Date('31 March 1999'),
description: 'freedom of mind'
}
]
}, 'der');
こちら Node.js 互換のため、Bufferのインスタンスが返ります。
Uint8Arrayにしたい場合は、Buffer.js に追加した toUint8Array メソッドを使ってください。
console.log(output.toUint8Array());
元に戻すときは decode を呼び出せばOK!
const human = Human.decode(output, 'der');
console.log(human);
{
firstName: ,
lastName: ,
age: ,
gender: "male",
bio: [
{
time: 922806000000,
description:
}
]
}
console.log(human.bio[0].description.toString())
freedom of mind
元通りです!
「岩塩熟成ジンギスカンぼんた」で作戦会議!