
๐ต๏ธ ์ ์ ์๋ ์ ์๋ฅผ ๊ฐ์ง Protocol Buffers๋ฅผ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋งํ๋ ๋๊ตฌ
Google Protobuf๋ก ์ธ์ฝ๋ฉ๋ blob(๋ฒ์ 2 ๋๋ 3)์ ํด๋น ์ ์ ์์ด๋ ํ์ฑํ ์ ์๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋๋ค. blob์ ๋ด์ฉ์ ๋ณด๊ธฐ ์ข๊ณ ์ปฌ๋ฌ๋ก ํํํด ์ค๋๋ค. ์์:

๋ณด์๋ค์ํผ ํ๋ ์ด๋ฆ์ ๋น์ฐํ ์ฌ๋ผ์ง๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์์ธ ์ ๋ณด๋ ํจ๊ป ์ฌ๋ผ์ง๋๋ค:
ํ์ง๋ง protobuf-inspector๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฉ์์ง ๊ตฌ์กฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ์ธกํ ์ ์์ต๋๋ค. ํ๋์ ์๋ฒ ๋๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด, ๋จผ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฉ์์ง๋ก ํ์ฑํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์คํจํ๋ฉด ๋ฌธ์์ด ๋๋ ํฅ์ค๋คํ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค. ์์ ์ฒญํฌ์์๋ ํนํ ์ค์ํ ์ ์์ต๋๋ค.
ํ๋๊ฐ ์์ด์ด์ ์ธ์ฝ๋ฉ๋ ์์๋๋ก ํ์๋๋ฏ๋ก, ์์ด์ด ํ์์ ์ต์ํด์ง๋ ค๋ ์ฌ๋์ด๋ ํ์ ๊ฐ๋ฐ์, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ์ ์ฉํ ์ ์์ต๋๋ค.
pip๋ก ์ค์นํ ์ ์์ต๋๋ค:
pip install protobuf-inspector
์ด ๋ช
๋ น์ protobuf_inspector ๋ช
๋ น์ด๋ฅผ ์ค์นํฉ๋๋ค. ์คํํ ๋ protobuf blob์ stdin์ผ๋ก ์ ๋ฌํฉ๋๋ค:
protobuf_inspector < my-protobuf-blob
blob์ ์ฒซ ๋ฒ์งธ (๋งน๋ชฉ์ ์ธ) ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ํ, ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ค ์ผ๋ถ๋ฅผ ์ ์ํ๊ธฐ ์์ํ์ฌ protobuf-inspector๊ฐ blob์ ๋ ์ ํ์ฑํ ์ ์๋๋ก ํ๋ฉฐ, ์ต์ข ์ ์ผ๋ก ์์ ํ protobuf ์ ์๋ฅผ ๊ฐ์ง๊ณ ํ์๊ฐ ๋ ์ด์ ์ถ์ธกํ ํ์๊ฐ ์๋ ์ง์ ์ ๋๋ฌํฉ๋๋ค.
ํ๋ ์ ์์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ.
ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ํด๋น ํ๋ ๋ด์์ ํ์ฑ์ด ์ค๋จ๋์ง๋ง, ๊ณ์ธต ๊ตฌ์กฐ ์ธ๋ถ์์๋ ์ํฅ์ ๋ฐ์ง ์๊ณ ๊ณ์ ์งํ๋ฉ๋๋ค. ํด๋น ํ๋ ๋ด์ฉ์ด ์์ด์ผ ํ ์์น์ ์คํ ํธ๋ ์ด์ค๊ฐ ์ถ๋ ฅ๋๋ฉฐ, ํด๋น ์ฒญํฌ์์ ํ์ฑ์ด ์ค๋จ๋ ์์น๋ฅผ ๋ํ๋ด๋ ํฅ์ค๋คํ๋ ํจ๊ป ํ์๋ฉ๋๋ค(ํด๋น๋๋ ๊ฒฝ์ฐ).
๋ฐ๋ผ์ uint32๋ฅผ ์ง์ ํ๋๋ฐ ๋ ํฐ varint๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค:

์ด๋ค ํ๋์ ์๋ฒ ๋๋ ๋ฉ์์ง๊ฐ ํฌํจ๋์ด ์๋ค๊ณ ์ง์ ํ์ง๋ง, ํด๋น ์์น์ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค:

ํ๋ ์ด์์ ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด main.py๊ฐ 0์ด ์๋ ์ํ ์ฝ๋๋ก ์ข
๋ฃ๋๋ค๋ ์ ์ ์ ์ํ์ธ์.
blob์ ๋ถ์ํ ๋ ์๊ฐ์ ์ ์ฝํ ์ ์๋ ๋ช ๊ฐ์ง ํ์ด ์์ต๋๋ค:
varint๊ฐ zig-zag ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ์ ํ์ง๋ง ์ฌ์ ํ ๋ถํธ๊ฐ ํ์คํ์ง ์๋ค๋ฉด, varint๋ก ๋จ๊ฒจ๋์ธ์. zig-zag ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ค๋ฉด, 32๋นํธ์ธ์ง 64๋นํธ์ธ์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ sint64๋ฅผ ์ฌ์ฉํ์ธ์.
์ด๋ค ์ฒญํฌ๊ฐ packed chunk ๋๋ ์๋ฒ ๋๋ ๋ฉ์์ง๋ก ์๋ชป ์ธ์๋๊ฑฐ๋, ํ์ฑ๋ ๋ฉ์์ง์ ์ด์ํ ์ ์ด ์์ด ์์ ๋ฐ์ดํธ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด, ํ์
์ bytes๋ก ์ง์ ํ์ธ์. ๋ฐ๋๋ก ์ด๋ค ์ด์ ๋ก ์๋ฒ ๋๋ ๋ฉ์์ง๋ก ๊ฐ์ง๋์ง ์์์ผ ํ๋๋ฐ ๊ฐ์ง๋๋ค๋ฉด, ๊ฐ์ ๋ก message๋ก ์ค์ ํ์ฌ ์ด์ ๋ฅผ ํ์ธํ์ธ์.
์ฒญํฌ์ ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ถ์ถํ์ฌ ๋ ์์ธํ ๋ถ์ํ๊ณ ์ถ๋ค๋ฉด, ํ์
์ dump๋ก ์ง์ ํ๋ฉด protobuf-inspector๊ฐ ์ผ์นํ๋ blob์ ์ฐพ์ ๋๋ง๋ค dump.0, dump.1 ๋ฑ์ ์์ฑํฉ๋๋ค.
protobuf-inspector๋ blob์ root ํ์
์ ๋ฉ์์ง๋ก ํ์ฑํ์ง๋ง, ์ด๋ ๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ์
๋๋ค. ๋ง์ ๋ฉ์์ง ํ์
์ด ์ ์๋์ด ์๋ค๋ฉด, ์ ํ์ ์ธ์๋ก ํ์
์ด๋ฆ์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ, protobuf-inspector๋ root ๋์ ํด๋น ํ์
์ ์ฌ์ฉํฉ๋๋ค:
protobuf_inspector request < my-protobuf-blob
๊ฐ๋จํ ์์ :
from protobuf_inspector.types import StandardParser
parser = StandardParser()
with open('my-blob', 'rb') as fh:
output = parser.parse_message(fh, "message")
print(output)
์ด ํ๋ก์ ํธ๋ ์ฒ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์ง ์์์ผ๋ฏ๋ก, API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ์์ ๋ protobuf_inspector/__main__.py๋ฅผ ์ฐธ์กฐํ์ธ์.