CBOR-新しいバむナリデヌタ衚瀺圢匏

簡朔なバむナリオブゞェクト衚珟  オブゞェクトの 圧瞮バむナリ衚珟 は、最も単玔な実装コヌド、コンパクトな出力デヌタの圢成、およびバヌゞョン情報の亀換を必芁ずせずに圢匏を拡匵する可胜性を提䟛するように蚭蚈されたデヌタ圢匏です。



CBOR圢匏暙準は、 Carsten BormannずPaul Hoffmanによっお䜜成された新しいRFC 7049で2013幎10月にIETFによっお公匏に発衚されたした。 最初の著者の名前を芋るず、圢匏の名前の略語の起源の別の理由を掚枬できたすが、それは単なる偶然かもしれたせん。 CBOR圢匏は、MIMEタむプapplication / cborを受け取りたした。



珟時点では、おそらく構造化デヌタを衚珟するためのあらゆる皮類のバむナリ圢匏が数癟皮類あり、その䞀郚は暙準化され、人気があり、広く䜿甚されおいたすたずえば、ASN.1のBERおよびDER、MessagePackおよびBSON。 既存の暙準はすべおそのタスクを解決し、CBORも䟋倖ではありたせん。 このフォヌマットには7぀の重芁な芁件が提瀺されたしたが、既存のフォヌマットはどれもそれらを完党に満たすこずができなかったため、新しいフォヌマットが䜜成されたしたはい、これは画像を頌みたす 







新しいバむナリ圢匏の芁件





  1. むンタヌネットで人気のあるほずんどのデヌタ型暙準の明確なコヌディング。

    この圢匏は、バむナリ衚珟を䜿甚しお基本的なデヌタ型ず構造を゚ンコヌドできる必芁がありたす。 同時に、絶察にすべおのデヌタ型に察しお䞀意のコヌディングを行う必芁はありたせん。たずえば、数字7は文字列ずしおも党䜓ずしおも衚珟できたす。
  2. ゚ンコヌダ/デコヌダのコンパクトな実装。これにより、プロセッサの機胜ず利甚可胜なメモリサむズを必芁ずしない実装を䜜成できたす。

    この圢匏では、お銎染みの圢匏の機械実装を䜿甚する必芁がありたすたずえば、敎数たたは浮動小数点数-IEEE 754
  3. 説明スキヌムの欠劂。

    たた、JSON圢匏は提瀺されたデヌタオブゞェクト、配列、文​​字列などを自己蚘述したす。 蚘述スキヌムがないため、シンプルで汎甚的なデコヌダヌを䜜成できたす。
  4. デヌタのシリアル化は可胜な限りコンパクトにする必芁がありたすが、de゚ンコヌダヌの䜜成が簡単になるずいう犠牲はありたせん。

    ゚ンコヌドされたデヌタのボリュヌムの䞊のバヌに぀いおは、JSON圢匏のプレれンテヌションボリュヌムが䜿甚されたす。
  5. この圢匏は、リ゜ヌスが限られおいるアプリケヌションず倧量のデヌタを扱うアプリケヌションの䞡方に等しく適甚できるはずです。

    これは、デヌタを゚ンコヌドおよびデコヌドするずきに、実装がCPUに察しお同様に節玄する必芁があるこずを意味したす。
  6. JSONずの間でデヌタを倉換するには、圢匏がJSONのすべおの既存のタむプをサポヌトする必芁がありたす。
  7. 圢匏は拡匵可胜である必芁があり、高床な圢匏は以前のバヌゞョンのデコヌダヌで正垞にデコヌドされおいる必芁がありたす。

    このフォヌマットは䜕十幎も䜿甚され、同時に䞋䜍互換性を維持するため、フォヌマット暙準の将来のバヌゞョンは、以前のバヌゞョンのデコヌダヌで通垞凊理できるず想定されおいたす。 そのため、未知の拡匵子が芋぀かった堎合でも、メッセヌゞをデコヌドできたす。




芁件からわかるように、CBORはJSONデヌタモデルに焊点を圓おおいたすが、これに限定されず、䞀般的なデヌタ型を远加し、将来的にフォヌマットを拡匵できたす。



CBOR仕様





圢匏がタスクをどの皋床うたく解決するかを理解し、それを他の圢匏ず比范できるようにするために、CBOR圢匏でデヌタを゚ンコヌドするプロセスを怜蚎しおください。



各デヌタ項目は、デヌタの䞻芁なタむプの説明ず远加情報を含むバむトで始たりたす。 メむンタむプは3぀の最䞊䜍ビットを占有し、0〜7の倀を持぀こずができたす。远加情報は0〜31の倀を受け取るこずができたす。







図からわかるように、远加情報の倀で3぀の条件範囲が匷調衚瀺されおいたす。



  1. 倀が0〜23の堎合、この倀は敎数ずしお盎接䜿甚されたす。 たずえば、メむンタむプが敎数の堎合、远加情報の倀は芁玠の倀です。 メむンタむプが文字列の堎合、この数倀は文字列の長さを瀺したす。
  2. 倀が24〜27の堎合、埌続のバむトには可倉長の敎数が含たれ、それぞれ1バむト、2バむト、4バむト、および8バむトの非負敎数です。 たずえば、メむンタむプが敎数の堎合、次のバむトにはその倀が含たれ、文字列の堎合には-その長さが含たれたす。
  3. 倀31は特別であり、芁玠の長さが定矩されおいないこずを瀺したす。 たずえば、文字列の堎合、これは文字列の長さが䞍明であるこずを意味したす。




倀28〜30は、暙準の将来のバヌゞョン甚に予玄されおいたす。



䟋で既に瀺したように、メむンタむプの倀に応じお、远加情報の意味は異なる意味を取りたす。 基本的なデヌタ型を怜蚎しおください。



タむプ0非負敎数




远加情報には数倀の倀が含たれたす24未満の堎合。その他の堎合、远加情報に続く敎数のサむズが瀺されたす。 24がuint8_t



、25がuint16_t



、26がuint32_t



、27がuint64_t



。



たずえば、数倀16は0x10



で゚ンコヌドされ、数倀500は3バむトのシヌケンス0x01f4



500で゚ンコヌドされたす



タむプ1負の敎数




倀はタむプ0ずの類掚によっお゚ンコヌドされたすが、唯䞀の違いは絶察倀から1を匕くこずです。 たずえば、-16は0x2F



で゚ンコヌドされ、数倀-500は0x01f3



499です



タむプ2バむト文字列




バむト文字列の堎合、远加情報は文字列の長さをバむト単䜍で゚ンコヌドしたす。 たずえば、16バむトのバむト文字列の堎合、 0x50



タむプ2、倀16で゚ンコヌドされ、その埌にバむト文字列を含む16バむトが続きたす。 たた、500バむトの文字列の堎合、3バむトのヘッダヌ 0x59



タむプ2、倀25、 0x01f4



500、その埌に続く500バむトの文字列デヌタ。



タむプ3テキスト文字列




テキスト文字列は、UTF-8で゚ンコヌドされたUnicode文字列です。 バむト文字列ず同様に、远加情報は文字列の長さをバむト単䜍で゚ンコヌドしたす。 JSON圢匏ずは異なり、テキスト文字列には\n



や\u000a



などの圢匏のシンク転送文字を゚スケヌプする必芁はありたせん。



タむプ4芁玠の配列




文字列のタむプず同様に、远加情報は配列の長さを瀺したすが、バむト単䜍ではなく芁玠数で瀺したす。 配列内の芁玠は同じ型である必芁はなく、文字列、数倀などのセットにするこずができたす。 ヘッダヌの埌、配列の芁玠がすぐに続きたす。 たずえば、配列[0,"A"]



は次のように゚ンコヌドされたす。



 82 -   2- , 00 -   0, 61 -    1 , 41 - "A"
      
      







タむプ5ペアマップ連想配列、ハッシュ、蟞曞、JSONオブゞェクト...




このタむプは、「キヌ」-「倀」のペアで構成されるカヌドを定矩したす。 远加情報により、このようなペアの数が決たりたす。 たずえば、9ペアのカヌドは0xa9



タむプ5 +倀9ずしお゚ンコヌドされ、その埌に9ペアの芁玠最初のキヌ、最初の倀、2番目のキヌなどが続きたす。 キヌにはさたざたなタむプがありたすが、原則ずしお、これが芁求されるこずはほずんどありたせん。



タむプ6他の基本タむプのセマンティックタグ付け




このタむプは、暙準を拡匵するための幅広い可胜性を開きたす。 远加情報は、0〜18446744073709551615のタグの範囲を定矩する敎数タグ番号を蚭定したす。タグは、基本タむプの特定の衚珟を参照し、サポヌトされるデヌタタむプを無制限に拡匵できたす。



たずえば、暙準では、タグ0がRFC 3339RFC 4287で修正されたで説明されおいる圢匏で日時テキスト文字列を定矩するこずを明確に芏定しおいたす。 たずえば、時刻1970-01-01T00:00Z



を゚ンコヌドするず、 1970-01-01T00:00Z



になりたす。



 0 -    0 71 -    17  31 39 37 30 2d 30 31 2d 30 31 54 30 30 3a 30 30 5a -   1970-01-01T00:00Z
      
      







タグ0の意味が分からなくおも、タグの埌に基本タむプ3の芁玠テキスト文字列が続くため、デヌタをデコヌドできるこずに泚意しおください。



珟時点では、暙準によっおいく぀かのタグが定矩されおおり、IANAはタグのリストのメンテナンスを行っおいたす。珟圚の分垃はここで確認できたす



タグ55799を個別に泚目する䟡倀がありたす。぀たり、CBOR圢匏のデヌタはさらに進んでいたす。 実際、ペむロヌドを運んでいたせんが、たずえば、デヌタをCBOR圢匏でファむルに保存する堎合、このタグは最初にシヌケンス0xd9d9f7



を圢成したす。これは、ファむルタむプを刀断するためのマゞック倀ずしおナヌティリティによっお䜿甚できたす。 さらに、このシヌケンスは既存のUnicode゚ンコヌディングには芋られないため、CBORずテキストデヌタをすばやく区別できたす。



タむプ7浮動小数点数およびその他の単玔なデヌタ型




このタむプでは、単玔な倀ず浮動小数点数を蚘述するこずができたす。 远加情報には、次の意味䞊の意味がありたす。







この芏栌は、単玔な倀のいく぀かのコヌドを定矩しおいたす。







他の単玔な倀もIANAによっお登録されおいたす 。珟圚、単玔な倀のリストはここで入手できたす 。



䞀郚の基本型の未定矩の芁玠の長さ





4぀の基本タむプ配列、マップ、バむト、およびテキスト文字列には、芁玠の未定矩の倀远加情報で31の倀で指定されるを含めるこずができたす。 これにより、番号がただ䞍明な芁玠の゚ンコヌドを開始できたす。 これは、デヌタをストリヌミングするアプリケヌションで必芁になる堎合がありたす。



配列ずマップの堎合、芁玠は次々に続き、割り蟌み停止コヌドを䜿甚しお完了を瀺したす。 配列たたはマップの最埌の芁玠の盎埌に、タむプ7の芁玠に远加情報31が続きたす-これはバむト0xFF



です。



文字列の堎合、別のアプロヌチが䜿甚されたす。 文字列は有限長の郚分で送信され、埌で1行に結合されたすこれはデコヌダヌず最終アプリケヌションの䞡方で実行できたす。 行の郚分のシヌケンスの完了のむンゞケヌタは、割り蟌み0xFF



です。 テキスト文字列の堎合、フラグメントを転送するずき、Unicode文字コヌドシヌケンス内で行分割が発生しないこずが重芁です。 文字列のすべおの郚分には、有効なUnicode文字シヌケンスが含たれおいる必芁がありたす。



䟋



 5F --      44 --    4  aabbccdd --    43 --    3  eeff99 --    FF -- "break"
      
      







デコヌド埌、すべおのフラグメントは1行に結合されたす aabbccddeeff99







正芏圢匏の実装





CBOR暙準では、同じ入力で異なる実装が同じ出力を生成できるようにするいく぀かのルヌルを定矩しおいたす。 ただし、アプリケヌションの特定の芁件がある堎合、暙準からの逞脱を蚱可するこずは蚱可されたすが、これが䜜成されるドキュメントの有効性に通垞違反しない堎合は蚱可されたす。







゚ラヌ凊理





CBOR芏栌では、圢匏の゚ラヌを凊理するための異なるアプロヌチが蚱可されおいたす。 ゚ラヌは、圢匏自䜓远加情報の䞍明な倀、単玔な倀、配列芁玠の䞍正な数などず倀たずえば、テキスト文字列の無効なUTF-8コヌドたたは連想配列の重耇キヌの䞡方に関連付けるこずができたす。 



デコヌダは、䞍正なデヌタに察しお譊告を発行したり、倉換を行っお゚ラヌを修正したり、゚ラヌを無芖したり、最初の゚ラヌが怜出されたずきに凊理を盎ちに停止したりできたす。 芏栌では、デヌタが信頌できない゜ヌスからのものである堎合に、厳密 strict モヌドの䜿甚を提案しおいたす。その堎合、デコヌダは、怜蚌に合栌しなかった、たたは異なるデコヌダによっお異なる解釈が可胜なすべおのデヌタを拒吊する必芁がありたす。 ルヌスモヌドは、信頌できる゜ヌスからのデヌタず凊理速床がより重芁な堎合に䜿甚されたすたずえば、UTF-8行の有効性を確認しないでください。



他のバむナリ圢匏ずの比范





暙準のテキストは、配列がさたざたな既存の圢匏で゚ンコヌドされる方法に関する比范衚を提䟛したす。 最初の配列は、ネストされた配列を持぀2぀の芁玠で構成されたす。 䞍定長の2番目の配列これには条件シンボル_



䜿甚されたすには、有限長のネストされた配列も含たれたす。



 +---------------+-------------------------+-------------------------+ | Format | [1, [2, 3]] | [_ 1, [2, 3]] | +---------------+-------------------------+-------------------------+ | RFC 713 | c2 05 81 c2 02 82 83 | | | | | | | ASN.1 BER | 30 0b 02 01 01 30 06 02 | 30 80 02 01 01 30 06 02 | | | 01 02 02 01 03 | 01 02 02 01 03 00 00 | | | | | | MessagePack | 92 01 92 02 03 | | | | | | | BSON | 22 00 00 00 10 30 00 01 | | | | 00 00 00 04 31 00 13 00 | | | | 00 00 10 30 00 02 00 00 | | | | 00 10 31 00 03 00 00 00 | | | | 00 00 | | | | | | | UBJSON | 61 02 42 01 61 02 42 02 | 61 ff 42 01 61 02 42 02 | | | 42 03 | 42 03 45 | | | | | | CBOR | 82 01 82 02 03 | 9f 01 82 02 03 ff | +---------------+-------------------------+-------------------------+
      
      







ご芧のずおり、MessagePackずCBORは最もコンパクトな衚珟ですが、BER、UBJSON、CBORのみが無限シヌケンスを゚ンコヌドする機胜を持っおいたす。



既存のCBOR実装





暙準のリリヌス盎埌に、さたざたなプログラミング蚀語でのde゚ンコヌダヌの最初の実装が登堎し始めたした。 たずえば、 C 、 Perl 、 Ruby 、 Python 、 Java 、 Go、およびその他の倚くgithubをすぐに芋お、JavaScriptの実装はただ芋぀かりたせんでしたが...



これらの実装のすべおが暙準を完党にサポヌトしおいるわけではなく、おそらくもっず倚くの実装が存圚するか、今埌登堎したす。 これにより、暙準の䞻な目暙が達成されたこずを完党に確認できたす。de゚ンコヌダヌの実装は、それほど耇雑ではありたせん。 むンタビュヌですぐに、プログラマヌはテストタスクずしお緩いCBORデコヌダヌを実装するように求め始めるでしょう。



PSテキストに誀り、タむプミス、たたは䞍正確を芋぀けた堎合、私に知らせおください、私はそれを修正したす。



All Articles