es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de codificación CBOR en el formato de claves

En JavaScript (sin usar node), estoy enfrentando diferentes resultados al codificar CBOR utilizando la biblioteca (https://github.com/paroga/cbor-js) y al usar CBOR online (https://cbor.me/). Observa que incluso al usar una biblioteca CBOR más reciente, el resultado es idéntico.

Por ejemplo, al definir un objeto como este:

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

La codificación usando CBOR online da como resultado: a201644a6f686e622d321901c8. Los detalles son los siguientes:

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

Ahora, la codificación usando la biblioteca CBOR en JavaScript da como resultado algo diferente: a26131644a6f686e622d321901c8

Cuando decodifico este hexadecimal en CBOR online, obtengo: {“1”: “John”, “-2”: 456}. El resultado es casi idéntico a la constante ‘initial’, excepto que la clave 1 ahora aparece entre comillas (“”).

CBOR online reformatea mi valor hexadecimal para que sea más legible:

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

A continuación se muestra mi código JavaScript:

//convertir una matriz de bytes (como 8 bits) en una cadena hexadecimal. Asegurarse de que el valor hexadecimal no tenga 1 dígito sino 2 dígitos. Por ejemplo, ’01’ en lugar de ‘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 );

Podría reemplazar manualmente valores hexadecimales específicos como:

’61 31 64′ reemplazado por ’01 64’

Pero no sería conveniente hacerlo, ya que la lista podría ser importante para cubrir todas las opciones posibles.

¿Alguien tiene una solución alternativa, ya que necesito que mi resultado sea ‘a201644a6f686e622d321901c8’ y no ‘a26131644a6f686e622d321901c8’?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la diferencia en los resultados de codificación entre la biblioteca CBOR en Javascript y la herramienta en línea CBOR se debe a la forma en que se manejan las claves.

    En el ejemplo proporcionado, la herramienta en línea CBOR codifica la clave 1 como una cadena de texto “1”, mientras que la biblioteca CBOR lo codifica como un número entero sin signo. Esto resulta en una codificación CBOR diferente para el mismo objeto.

    Una solución alternativa para asegurar una codificación CBOR consistente podría ser convertir el objeto a una cadena de texto y luego codificarlo usando la biblioteca CBOR. Esto garantizaría que todas las claves se codifiquen como cadenas de texto y debería resultar en una codificación consistente en diferentes herramientas.

    Aquí tienes un ejemplo:

    const initial = { 1: "John", "-2": 456 };
    
    const initialString = JSON.stringify(initial);
    
    const encoded = CBOR.encode(initialString);
    const encodedHex = toHexString(Array.from(new Uint8Array(encoded)));
    console.log(encodedHex); // Debería mostrar: a201644a6f686e622d321901c8
    

    Al convertir el objeto a una cadena de texto, nos aseguramos de que todas las claves se traten como cadenas de texto, lo que debería resultar en una codificación consistente independientemente de la herramienta utilizada.

Comments are closed.