Décodeur Protocol Buffers

Étape 1 / 333%

Inspectez un message Protocol Buffers encodé sans le téléverser ni prétendre connaître son schéma. Ce décodeur exécuté dans le navigateur accepte explicitement des données hexadécimales, Base64, Base64URL, du texte UTF-8 brut ou un fichier binaire. Il parcourt chaque type wire valide, conserve la valeur exacte des entiers 64 bits, signale l’offset des données mal formées et affiche toutes les interprétations complètes des valeurs délimitées par une longueur. Le payload reste dans votre navigateur et aucun service mentionné dans les données n’est contacté.

Fonctionnement

  1. 1

    Choisissez précisément l’encodage

    Sélectionnez hexadécimal, Base64, Base64URL, texte UTF-8 brut ou fichier binaire. L’outil ne tente jamais de deviner le format.

  2. 2

    Inspectez les champs wire

    Décodez les tags, numéros de champ et valeurs wire, puis développez chaque candidat imbriqué ou packed valide sans lui attribuer un type de schéma.

  3. 3

    Exportez le rapport

    Téléchargez un rapport JSON sans schéma, un CSV protégé contre les formules ou un rapport texte lisible.

Ce qu’un décodeur Protobuf sans schéma peut établir

Protocol Buffers stocke une suite de tags de champ et de valeurs, pas les déclarations .proto d’origine. Le guide officiel de l’encodage protobuf définit chaque tag par (field_number << 3) | wire_type. Le décodeur peut donc établir le numéro de champ, le type wire, les limites en octets et les encodages structurellement possibles. Il ne peut pas déterminer si un varint a été déclaré comme uint64, int64, sint64, bool ou enum, car ces déclarations peuvent partager les mêmes octets.

Le mode d’entrée est toujours choisi explicitement. Le mode hexadécimal accepte les espaces ASCII et au plus un préfixe 0x. Base64 et Base64URL sont validés séparément, y compris leur longueur, leur padding et leurs bits de remplissage inutilisés ; les alphabets standard et compatible URL ne peuvent pas être mélangés. Le texte brut correspond exactement aux octets UTF-8 produits par le TextEncoder du navigateur : les séquences d’échappement avec barre oblique inverse ne sont pas interprétées. Pour un fichier, les octets exacts sont lus.

Types wire et interprétations

Type wire Valeur encodée Contenu du rapport
0 Varint Valeurs exactes non signée, signée en complément à deux et ZigZag ; booléen uniquement pour 0 ou 1
1 Huit octets little-endian Entiers fixed64 et sfixed64 exacts, plus un candidat double
2 Longueur suivie d’octets Hexadécimal et Base64, UTF-8 strict s’il est valide, puis tous les candidats imbriqués ou packed complets
3 / 4 Tags de début et de fin de groupe Enfants du groupe portant le même numéro de champ ; le tag final délimite et ne constitue pas un enregistrement
5 Quatre octets little-endian Entiers fixed32 et sfixed32 exacts, plus un candidat float

Le type Number ordinaire de JavaScript ne représente pas exactement tous les entiers 64 bits. Le parseur utilise donc BigInt de bout en bout et convertit les entiers exacts en chaînes décimales pour l’affichage et l’export. Les valeurs flottantes particulières comme NaN, les infinis et le zéro négatif sont aussi exportées sous forme de chaînes afin que JSON ne les transforme pas silencieusement.

Comprendre l’ambiguïté des valeurs délimitées par une longueur

Le type wire 2 sert aux chaînes, aux octets bruts, aux messages intégrés et aux valeurs scalaires répétées packed. Sans schéma, une même séquence d’octets peut remplir plusieurs rôles. Par exemple, 2a 03 01 02 03 est le champ 5 contenant trois octets. Ils forment des varints packed valides [1, 2, 3], mais restent aussi de simples octets. Le décodeur affiche les deux possibilités sans en présenter une comme plus probable.

Un candidat de message imbriqué n’apparaît que si tout le contenu délimité par la longueur forme un message complet. Les candidats varint, fixed32 et fixed64 packed ne sont également affichés que si leur interprétation consomme tous les octets. Un candidat UTF-8 strict exige que toute la séquence soit décodée sans caractère de remplacement. Ces vérifications indiquent des possibilités structurelles, et non le type déclaré du champ.

Les groupes sont analysés selon la grammaire wire, même si les schémas modernes préfèrent généralement les messages intégrés. Un tag de début de groupe doit être fermé par un tag de fin portant le même numéro de champ. Une fin au niveau racine, un numéro différent ou une fin manquante produit une erreur fatale à l’offset exact. Les champs complets décodés auparavant restent visibles ; les octets manquants et valeurs inconnues ne deviennent jamais un faux zéro.

Limites, framing et manipulation sûre

Le décodeur accepte un seul message sans framing, limité à 10 Mio. Il ne sépare pas un flux préfixé par une longueur, une frame gRPC, un fichier de messages délimités ni une enveloppe de transport. Retirez d’abord ce framing, puis décodez un message. Le parseur limite le nombre total d’enregistrements, la profondeur récursive, les lignes visibles et le travail consacré aux candidats. Ces protections suivent l’esprit des recommandations officielles sur les grands jeux de données et les limites d’implémentation : protobuf est efficace, mais un onglet de diagnostic doit tout de même borner sa mémoire et son travail.

Les numéros de champ doivent être compris entre 1 et 536 870 911. La plage 19 000–19 999 déclenche un avertissement, car les recommandations officielles sur les numéros de champ réservent cette plage à l’implémentation. Les types wire 6 et 7 sont invalides.

L’analyse et les exports se font localement. La vue en plusieurs étapes peut conserver un payload limité dans le sessionStorage de cet onglet pendant deux heures au maximum ; recommencer l’efface. Rien n’est ajouté à l’URL ni envoyé à nos serveurs. La sortie JSON est explicitement un rapport de décodage au format propre à cet outil, pas du ProtoJSON. Le CSV commence par un BOM UTF-8 et neutralise les cellules ressemblant à des formules pour une ouverture plus sûre dans un tableur. Un rapport peut malgré tout contenir des données applicatives confidentielles : vérifiez-le avant de le partager.

Questions fréquentes

Non. Le format wire conserve les numéros de champ et leurs encodages, mais plusieurs types scalaires déclarés peuvent partager les mêmes octets. Les noms, commentaires et la plupart des intentions du schéma sont absents.

Non. La validation, l’analyse, les filtres et les exports s’exécutent dans votre navigateur. Le payload n’est ni envoyé à nos serveurs ni placé dans l’URL.

Une valeur délimitée par une longueur peut représenter des octets, du texte UTF-8, un message intégré ou des valeurs packed. Sans schéma, afficher chaque candidat complet est plus fidèle que deviner.

À cet endroit, un tag, un varint, une valeur de largeur fixe, une longueur déclarée ou une limite de groupe était incomplet ou invalide. Les champs complets précédents restent dans le rapport partiel.

Pas directement. Ce décodeur lit un seul message protobuf et ne retire ni le framing gRPC, ni une longueur varint, ni toute autre enveloppe de transport. Extrayez d’abord le payload d’un message.

Outils similaires

Outil disponible dans d’autres langues