2021-12-09
ラジオ番組「CyberValley, Japan」で標準を作ろうと話題になった「電子帳簿保存法」。 電子署名などを安全に加えるためにはバイナリフォーマットが良いよと帝都にオススメされた CBOR(シーボル) をお試し!


CBOR — Concise Binary Object Representation | Overview
スッキリシンプルなCBORオフィシャルサイト。挙げられている特徴は3つ。
- JSON同様スキーマレスなデータ構造 - Protocol Buffersはスキーマが必要
- 暗号鍵や画像などバイナリ対応 - 大容量データの高速処理が可能
- 標準仕様(RFC 8949)と許諾不要の拡張性 - 日本発のMessagePackが元!

早速実装を見てみると、JavaScript版cbor-jsがありましたが、実装が古くvarまみれ、ESモジュールに対応していないため、forkしてCBOR-esを作成しました。


code4fukui/CBOR-es: The Concise Binary Object Representation (CBOR) data format (RFC7049) implemented in pure JavaScript (ES Module). CBOR.js
使い方は簡単! import { CBOR } from "https://code4fukui.github.io/CBOR-es/CBOR.js"; const initial = { Hello: "World" }; const encoded = CBOR.encode(initial); const decoded = CBOR.decode(encoded); ESモジュールなので、ブラウザやDenoのコードでimport文を加えるだけですぐ使えます。変換コードも345行、依存なしの1ファイル(CBOR.js)とすっきりシンプル&安全です!

遭遇し、回避・解決したバグ2つ
1. 元のcbor-jsでは、JSONとArrayBufferの相互変換でしたが、DenoのreadFileではArrayBufferとUint8Arrayのサイズが合わない問題があり、取り回しやすさを踏まえてCBOR-esでは、JSONとUint8Arrayの相互変換に変更。
2. utf8の文字列処理のバグ、cbor-jsは文字列からutf8への変換に独自コードを使っていましたが全角アルファベットなど一部日本語が化ける現象に遭遇。TextEncoder/TextDecoderを使う実装に変更しました。


地域情報化アドバイザーオープンデータ」のCSVデータを、CBORに変換した .csv.cbor ファイル、JSONにした上でCBORに変換した .cbor ファイル、JSONファイルとそれぞれ作って、ファイルサイズとデコード時間を比較した結果です。

CSVとCBOR/CSVはファイルサイズも速度もほぼ一緒。ライブラリが小さい分CBORが良さそう。JSONをCBORにするとファイルサイズが若干減りますが、ネイティブのパーサーが速すぎるという結果となりましたが、いずれも十分実用範囲です。

CBOR(シーボル)バイナリデータを気軽に扱うには良さそうですね!

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