2023-12-25
構造化されたデータを表現する方法のひとつ、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 元通りです!


「岩塩熟成ジンギスカンぼんた」
で作戦会議!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS