0

javascript (ノードを使用しない) では、ライブラリ ( https://github.com/paroga/cbor-js ) を使用して CBOR エンコードを行う場合と、オンラインで CBOR を使用する場合( https://cbor.me/ ) で異なる結果に直面しています。最新の CBOR ライブラリを使用しても、結果は同じであることに注意してください。

たとえば、次のようなオブジェクトを設定します。

const initial = { 1: "John", "-2": 456 };

オンラインで CBOR を使用してエンコードすると、a201644a6f686e622d321901c8 が得られます。詳細は次のとおりです。

A2             # map(2)
   01          # unsigned(1)
   64          # text(4)
      4A6F686E # "John"
   62          # text(2)
      2D32     # "-2"
   19 01C8     # unsigned(456)

javascript で CBOR ライブラリを使用してエンコードすると、異なる結果が得られます: a26131644a6f686e622d321901c8

これを CBOR オンラインで 16 進数でデコードすると、次のようになりました: {"1": "John", "-2": 456}。結果は、キー 1 が引用符 (") で表示されることを除いて、定数 'initial' とほぼ同じです。

CBOR online は、16 進数値をより「読みやすい」ビューに再フォーマットします。

A2             # map(2)
   61          # text(1)
      31       # "1"
   64          # text(4)
      4A6F686E # "John"
   62          # text(2)
      2D32     # "-2"
   19 01C8     # unsigned(456)

以下の私のJavascriptコードを参照してください:

    //convert an array of bytes (as 8 bits) to string of Hex. ensure that Hex value are not return with 1 digit but 2 digits. ie '01' instead of '1'
    function toHexString(byteArray) {
      var s = '';
      byteArray.forEach(function(byte) {
        s += ('0' + (byte & 0xFF).toString(16)).slice(-2);
      });
      return s;
    }

    const initial = { 1: "John", "-2": 456 };
    
    var encoded = CBOR.encode(initial);
    var encodedHex = toHexString(Array.from(new Uint8Array(encoded)));
    console.log ( encodedHex );

次のような特定の 16 進数値を手動で置き換えることができます。

'61 31 64' は '01 64' に置き換えられました

しかし、可能性のあるすべてのオプションをカバーするためにリストが重要になる可能性があるため、それを行うのは好きではありません。

結果を 'a26131644a6f686e622d321901c8' ではなく 'a201644a6f686e622d321901c8' にする必要があるため、回避策はありますか?

4

1 に答える 1