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' にする必要があるため、回避策はありますか?