2017-01-02 57 views
0

我試圖從一個使用protobuf的程序創建的文件中獲取原始標題消息。我不擁有源程序或任何東西,但我會很滿意protoc --decode_raw的輸出。不幸的是,這不起作用,因爲我得到「無法解析輸入」的錯誤。我相信這是因爲文件中有protobuf數據的標題。源程序是DOTA2,文件就是這樣開始的;意識到文件的哪一部分是標題,什麼是標題消息

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 

我沒有知識或經驗使用protobuf的努力,所以我有點不確定,其中頭端和protobuf的消息開始解碼此文件之前。我非常有信心,達到「..v1831/dota8」是標題的一部分,但刪除這仍然給我沒有解析輸入問題。

我已經在任何關於這種類型的文件(這是一個DOTA2演示下載)的細節看過網絡,還有其他程序人做了這樣的任務,但我找不到明確的切割有關標題長度的信息。我使用這部分是爲了瞭解protobuf,所以使用另一個應用程序並不是我正在尋找的東西。

僅供參考,我打算最終在vb.net中使用這個工具,因此我使用protobuf-net(我不這樣認爲它與問題/答案相關,但爲防萬一,它的格式爲here)。

+0

如果你可以提供數據的十六進制轉儲,我可能能夠找出標題。但是你只提供了文本,這意味着一些位已經丟失,所以我不能從中獲得太多。我最好的猜測是,前8個字節是一個「幻數」,然後protobuf數據開始。 –

+0

@KentonVarda我幾分鐘前完全錯過了你的評論!我用十六進制轉儲更新了問題,而不是文本。任何猜測? – FraserOfSmeg

回答

2

前33個字節是標題。標題以8字節的序列「PBDEMS2 \ 0」(包括\ 0,又名NUL字節)開始和結束。 protobuf數據在第二個「PBDEMS2 \ 0」(NUL字節之後的字節)之後立即開始。

您只提供了數據的開頭,所以當我嘗試將它提供給protoc --decode_raw時,它仍然出錯,因爲數據提前結束。但解碼手動將數據似乎開始走出這樣的:

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 

然而,這是可疑的:請注意,場數日益順序,然後突然啓動,從1後面還注意到,現場2具有不同的類型第二次。我認爲我們在這裏看到的實際上是多個消息 - 可能是不同類型 - 緊接着。

不幸的是,很難說你應該如何判斷一條消息結束和下一條消息的開始。這頭可能告訴你,但我不知道如何解碼它。標題似乎不是protobuf格式。

+0

感謝,似乎確實有道理。我不能在文件上使用protoc --decode_raw(即使我刪除了前33個字節)。你是如何手動解碼的? – FraserOfSmeg

+0

https://developers.google.com/protocol-buffers/docs/encoding - 格式不是很複雜。也就是說,我已經多次實施它,從中受益。 :) –

+0

再次感謝。我會試着花一點時間去解決這個問題,也許把我自己的實現放在一起吧! – FraserOfSmeg

相關問題