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
Cómo usar Decodificador de Protobuf
- Pega el mensaje codificado en hex o Base64, o sube el archivo binario. El formato se detecta automáticamente.
- Lee el árbol: cada línea muestra el número de campo, el tipo detectado, el valor y su desplazamiento en bytes.
- 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.
- Quita un prefijo si los bytes vienen de gRPC o de un flujo delimitado por longitud.
- Cambia a la vista JSON o decode_raw y copia o descarga el resultado.
Tipos de cable de Protobuf de un vistazo
| Tipo de cable | Nombre | Tamaño | Se usa para |
|---|---|---|---|
| 0 | VARINT | De 1 a 10 bytes | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
| 1 | I64 | 8 bytes, little-endian | fixed64, sfixed64, double |
| 2 | LEN | longitud varint + datos | string, bytes, mensajes incrustados, campos repetidos empaquetados, entradas de map |
| 3 | SGROUP | hasta el EGROUP correspondiente | grupos de proto2 (obsoletos) |
| 4 | EGROUP | solo la etiqueta | fin de un grupo de proto2 |
| 5 | I32 | 4 bytes, little-endian | fixed32, 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:
08es la etiqueta: 8 >> 3 = campo 1, 8 & 7 = tipo de cable 0 (VARINT).96 01es 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
writeDelimitedToempiezan 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
01suele 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.