2017-01-02 1 views
0

J'essaie de récupérer les protobuf bruts d'un fichier créé par un programme qui utilise protobuf. Je ne possède pas le programme source ou quoi que ce soit, mais je serais heureux avec la sortie de protoc --decode_raw. Malheureusement, cela ne fonctionne pas car j'obtiens l'erreur "Impossible d'analyser l'entrée". Je crois que c'est parce qu'il y a un en-tête pour les données protobuf dans le fichier. Le programme source est DOTA2 et les fichiers commencent comme ceci;Reconnaissance de la partie d'un fichier qui est un en-tête et des messages protobuf

50 42 44 45 4d 53 32 00 f0 54 0e 03 f7 bf 0d 03 
01 ff ff ff ff 0f 7b 0a 08 50 42 44 45 4d 53 32 
00 10 2c 1a 2e 56 61 6c 76 65 20 44 6f 74 61 20 
32 20 45 55 20 4e 6f 72 74 68 20 53 65 72 76 65 
72 20 28 73 72 63 64 73 31 32 35 2e 31 38 35 2e 
36 34 29 22 0d 53 6f 75 72 63 65 54 56 20 44 65 
6d 6f 2a 05 73 74 61 72 74 32 1f 2f 6f 70 74 2f 
73 72 63 64 73 2f 64 6f 74 61 2f 64 6f 74 61 5f 
76 31 38 33 31 2f 64 6f 74 61 38 02 40 01 48 01 
52 00 08 ff ff ff ff 0f 11 08 01 10 01 1a 0b 44 
02 82 e8 01 08 00 0a 00 0c 00 08 ff ff ff ff 0f 
16 08 02 10 02 1a 10 d3 34 28 14 cc d1 85 c9 d1 
41 e0 b3 46 47 06 20 08 ff ff ff ff 0f e7 03 08 
03 10 03 1a e0 03 98 70 0f 20 d4 26 40 10 60 04 
80 04 c0 b0 f5 e0 59 d1 48 40 01 61 91 17 80 01 
b4 25 22 22 f4 c8 7d bc bc c1 d1 bd cc c9 8d 91 
cd bd 90 bd d1 85 bd 90 bd d1 85 7d d9 c5 e0 cc 
c4 bc 90 bd d1 85 e9 15 cc d1 85 c9 d1 29 06 20 
4c bd d5 c9 8d 95 51 59 49 06 00 68 06 ac 06 20 

Je ne connais pas ou de l'expérience en utilisant protobuf avant d'essayer de décoder ce fichier, donc je suis un peu incertain où les extrémités d'en-tête et le message protobuf commence. Je suis assez confiant que jusqu'à "..v1831/dota8" fait partie de l'en-tête, mais la suppression de cela me donne toujours le problème d'entrée d'analyser. J'ai regardé partout sur le net pour des détails sur ce type de fichier (c'est un téléchargement démo DOTA2) et il y a d'autres programmes que les gens ont fait qui font ce genre de tâche, mais je ne trouve pas de coupe nette informations sur la longueur de l'en-tête. J'utilise ceci en partie pour apprendre à propos de protobuf, donc utiliser une autre application n'est pas vraiment ce que je cherche. Pour référence, j'ai l'intention de finir par travailler avec vb.net et donc j'utilise protobuf-net (je ne sais pas si c'est lié à la question/réponse, mais c'est here juste au cas où).

+0

Si vous pouviez fournir un vidage hexadécimal des données, je pourrais peut-être comprendre l'en-tête. Mais vous n'avez fourni que du texte, ce qui signifie qu'un tas de bits ont été perdus, donc je ne peux pas faire grand-chose. Ma meilleure estimation est que les 8 premiers octets sont un "nombre magique" et que les données protobuf commencent. –

+0

@KentonVarda J'ai complètement raté votre commentaire jusqu'à il y a quelques minutes! J'ai mis à jour la question avec un vidage hexadécimal au lieu du texte. Des suppositions? – FraserOfSmeg

Répondre

2

Les 33 premiers octets sont l'en-tête. L'en-tête commence et se termine par la séquence de 8 octets "PBDEMS2 \ 0" (y compris l'octet NUL \ 0). Les données protobuf commencent immédiatement après le deuxième "PBDEMS2 \ 0" (l'octet après l'octet NUL).

Vous avez seulement fourni le début des données, donc quand j'essaye de l'alimenter à protoc --decode_raw il continue d'y avoir des erreurs parce que les données se terminent prématurément. Mais le décodage manuellement les données semble commencer comme ceci:

2: 44 
3: "Valve Dota 2 EU North Server (srcds125.185.64)" 
4: "SourceTV Demo" 
5: "start" 
6: "/opt/srcds/dota/dota_v1831/dota" 
7: 2 
8: 1 
9: 1 
10: "" 
1: 4294967295 // (probably actually -1) 
2: 0x02440b1a01100108 

Cependant, ceci est suspect: Notez que les numéros de champ sont de plus en plus de façon séquentielle et puis tout à coup a commencé à partir de 1. Notez également que le champ 2 a un type différent la deuxième fois. Je pense que ce que nous voyons ici est en fait plusieurs messages - probablement de différents types - dos-à-dos.

Malheureusement, il est difficile de dire comment vous êtes censé dire où un message se termine et le suivant commence. Probablement cet en-tête vous dit, mais je ne sais pas comment le décoder. L'en-tête ne semble pas être protobuf-format.

+0

merci cela semble logique. Je ne peux pas non plus utiliser protoc --decode_raw sur les fichiers (même si je supprime les 33 premiers octets). Comment l'avez-vous décodé manuellement? – FraserOfSmeg

+0

https://developers.google.com/protocol-buffers/docs/encoding - Le format n'est pas très compliqué. Cela dit, je profite de l'avoir implémenté plusieurs fois. :) –

+0

Merci encore. Je vais essayer de passer un peu de temps à le faire et peut-être monter ma propre implémentation! – FraserOfSmeg