Scheinbare Nichtübereinstimmung zwischen Oraclize CBOR- und Python3-CBOR-Codierungen

Ich habe einen Wert mit der Oraclize CBOR-Bibliothek wie folgt codiert:

    Buffer.buffer memory cborArgs;
    Buffer.init(cborArgs, 64);
    cborArgs.startArray();
    cborArgs.encodeUInt(10);
    cborArgs.endSequence();

Was produziert:

\\xef\\xbf\\xbd\\\\n

Aber es scheint nicht mit dem Ergebnis der gleichen Codierung in Python3 übereinzustimmen.

print(str(cbor2.dumps([10]))

produziert

\x81\n

Was ist los?

Antworten (1)

Sie möchten sich wahrscheinlich auf die Hex-Darstellung von jedem beziehen. Wenn Sie die Hex-Darstellung verwenden, sehen Sie, dass sie fast identisch sind und sich nur darin unterscheiden, dass cbor2 von Python ein statisches Array der Länge 3 definiert, während die cbor-Bibliothek einfach ein Array mit dynamischer Größe für Effizienz und Anpassungsfähigkeit in der Kette verwendet. Beide entsprechen dem cbor-Standard.

Solidität

    Buffer.buffer memory cborArgs;
    Buffer.init(cborArgs, 64);
    cborArgs.startArray();
    cborArgs.encodeUInt(1);
    cborArgs.encodeUInt(222);
    cborArgs.encodeUInt(9000);
    cborArgs.endSequence();
    debug(cborArgs.buf);

debug[ "0x9f0118de192328ff" ]

Python

import cbor2 import binascii print(binascii.b2a_hex(cbor2.dumps([1, 222, 9000])))

b'830118de192328'

Wie Sie sehen können, besteht der einzige Unterschied im ersten Byte, das ein dynamisches und kein statisches 3-Element-Array angibt. Dies erforderte wiederum ein zusätzliches FF-Byte zum Abschluss.