Inicio › Herramientas para desarrolladores › Decodificador de Protobuf

Decodificador de Protobuf

Pega un mensaje de Protocol Buffers en hex o Base64 para ver cada número de campo, tipo de cable y valor, con los mensajes anidados, las cadenas y los números empaquetados detectados automáticamente. Añade tu archivo .proto para obtener los nombres de los campos, los nombres de los enum y los valores con su tipo correcto.

Última actualización:

Esquema (.proto) opcional, para los nombres de los campos
Publicidad
Publicidad

Cómo usar Decodificador de Protobuf

  1. Pega el mensaje codificado en hex o Base64, o sube el archivo binario. El formato se detecta automáticamente.
  2. Lee el árbol: cada línea muestra el número de campo, el tipo detectado, el valor y su desplazamiento en bytes.
  3. Si quieres, añade tu .proto en el panel de esquema y elige el mensaje raíz para ver los nombres de los campos y los valores de los enum.
  4. Quita un prefijo si los bytes vienen de gRPC o de un flujo delimitado por longitud.
  5. Cambia a la vista JSON o decode_raw y copia o descarga el resultado.

Tipos de cable de Protobuf de un vistazo

Tipo de cableNombreTamañoSe usa para
0VARINTDe 1 a 10 bytesint32, int64, uint32, uint64, sint32, sint64, bool, enum
1I648 bytes, little-endianfixed64, sfixed64, double
2LENlongitud varint + datosstring, bytes, mensajes incrustados, campos repetidos empaquetados, entradas de map
3SGROUPhasta el EGROUP correspondientegrupos de proto2 (obsoletos)
4EGROUPsolo la etiquetafin de un grupo de proto2
5I324 bytes, little-endianfixed32, sfixed32, float

Leer un mensaje a mano

Cada campo empieza con una etiqueta, un varint igual a (field_number << 3) | wire_type. Un varint guarda 7 bits por byte, primero el grupo menos significativo, y el bit alto de cada byte indica si sigue otro byte. Toma los bytes 08 96 01:

  • 08 es la etiqueta: 8 >> 3 = campo 1, 8 & 7 = tipo de cable 0 (VARINT).
  • 96 01 es el valor: 0x96 tiene activado el bit de continuación, así que toma sus 7 bits bajos (0x16 = 22) y suma el siguiente byte desplazado 7 posiciones (1 × 128). El valor es 150.

En un campo delimitado por longitud como 12 07 74 65 73 74 69 6e 67, la etiqueta 0x12 significa campo 2, tipo de cable 2, y el siguiente varint (7) es el número de bytes de datos que siguen, aquí el texto UTF-8 "testing". Bytes de etiqueta comunes que conviene reconocer: 0a (campo 1, LEN), 10 (campo 2, VARINT), 12 (campo 2, LEN), 18 (campo 3, VARINT), 1a (campo 3, LEN).

Consejos para decodificar cargas útiles reales

  • Base64 de JSON o de registros: gRPC-Web, Firebase y muchas API codifican en Base64 los bytes de protobuf. Pégalos directamente; también funciona el Base64 seguro para URL con - y _.
  • Flujos con prefijo de longitud: los archivos escritos con writeDelimitedTo empiezan cada mensaje con una longitud varint. Usa la opción de omitir delimitado por longitud para el primer mensaje.
  • Los valores int32 negativos siempre se codifican como varints de 10 bytes, así que un varint largo que termina en 01 suele ser un número negativo; revisa la lectura int64.
  • Floats y doubles: un campo de 32 o 64 bits se muestra como float o double cuando el valor parece un número corriente; si no, como entero sin signo, con la otra lectura al lado.
  • Proto2 frente a proto3: ambos usan el mismo formato de cable. Proto3 empaqueta por defecto los campos numéricos repetidos, y el decodificador los desempaqueta estén o no empaquetados.

Preguntas frecuentes

¿Se puede decodificar protobuf sin el archivo .proto?

Sí, en parte. El formato binario guarda el número de cada campo y su tipo de cable, así que la estructura, los números y las cadenas siempre se pueden recuperar. Lo que se pierde sin el esquema son los nombres de los campos y los tipos exactos: un varint puede ser un int32, un bool, un enum o un sint codificado en ZigZag, por eso el decodificador muestra las lecturas probables una junto a otra.

¿Qué son los tipos de cable (wire types) de protobuf?

Cada campo empieza con una etiqueta que contiene el número de campo y un tipo de cable de 3 bits: 0 VARINT (int32, int64, uint, sint, bool, enum), 1 I64 (fixed64, sfixed64, double), 2 LEN (string, bytes, mensajes anidados, campos repetidos empaquetados), 3 y 4 inicio y fin de grupo (grupos de proto2 obsoletos) y 5 I32 (fixed32, sfixed32, float). La propia etiqueta es el varint (field_number << 3) | wire_type.

¿Cómo distingue el decodificador una cadena de un mensaje anidado?

Un campo delimitado por longitud puede contener cualquiera de los dos. El decodificador comprueba primero si los bytes son texto UTF-8 válido e imprimible y los muestra como cadena; si no, intenta analizarlos como mensaje y solo acepta el resultado si todos los bytes se consumen en campos válidos. Si nada funciona, prueba con varints empaquetados y, por último, muestra los bytes sin procesar. Cuando una cadena también se puede analizar como mensaje, se indica para que lo compruebes con un esquema.

¿Qué es la codificación ZigZag?

Los campos sint32 y sint64 asignan números con signo a números sin signo para que los valores negativos pequeños sigan siendo cortos: 0 pasa a 0, -1 a 1, 1 a 2, -2 a 3, y así sucesivamente, usando (n << 1) ^ (n >> 63). Sin ella, un int32 o int64 negativo siempre ocupa 10 bytes como varint. El decodificador muestra la lectura ZigZag de cada varint como "sint".

¿Cómo decodifico un mensaje gRPC?

Un mensaje gRPC en la red tiene un prefijo de 5 bytes: un byte de indicador de compresión y una longitud de 4 bytes big-endian. Elige "Trama gRPC" en Omitir bytes iniciales para quitarlo. Si el indicador es 1, la carga útil está comprimida (normalmente con gzip) y hay que descomprimirla antes de poder decodificarla.

¿Por qué los números de 64 bits son cadenas en la salida JSON?

La asignación JSON de proto3 escribe los valores int64, uint64, fixed64 y sfixed64 como cadenas, porque los números de JavaScript pierden precisión por encima de 2^53. Sin esquema, los varints pequeños se escriben como números y los más grandes como cadenas por el mismo motivo.

¿Se envían mis datos a un servidor?

No. El mensaje y el archivo .proto se analizan con JavaScript en la pestaña de tu navegador. No se sube nada, así que puedes inspeccionar con seguridad cargas útiles de producción.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Codificadores, hashes y criptografía →