協定檢查

Protobuf Wire 資料:位元組邊界不是 Schema

原始 Protobuf 串流提供欄位編號與 wire type,不包含欄位名稱,也不足以還原原始宣告型別。

內容更新: · 維護者與修正回報

依 Tag 及不含結尾的位置閱讀

Tag 是 (field_number << 3) | wire_type,本身也用 varint 儲存。Wire 0 帶 varint,wire 1 帶八個小端序位元組,wire 2 帶長度 varint 及指定長度位元組,wire 5 帶四個小端序位元組。位置從零起算,範圍採 [開始, 結束),不含結尾。

08 96 01 12 03 66 6f 6f 的欄位 1 從 byte 0 開始,tag 為 8、原始無號值 150,結束於 byte 3 前。欄位 2 從 byte 3 開始,payload 從 byte 5 開始,三個位元組結束於 byte 8 前。欄位編號零無效,19000–19999 會標示為 schema 保留編號。

區分原始證據及解讀

Varint 可能代表 int、uint、ZigZag 有號值、bool 或 enum,必須依 schema 決定。本工具用 BigInt 精確報告原始無號整數;fixed32/fixed64 分開顯示無號與原生浮點解讀,不宣稱其中任何一項是宣告型別。

長度資料可能是字串、位元組陣列、巢狀訊息或 packed 值。嚴格 UTF-8 解碼只當作可能的文字解讀,包含控制字元,不替 schema 做決定。UTF-8 無效時仍保留原始 Hex;不遞迴猜測巢狀訊息,也不拆解 gRPC frame。

明確限制並整筆失敗

Group(wire type 3/4)明確不支援。無效 tag、超過十位元組或 uint64 溢位的 varint、非標準過長 varint、截斷的固定寬度欄位、長度超出剩餘資料時,整份報告拒絕。部分 Protobuf 讀取器可能容忍非最短編碼,本工具嚴格契約不代表所有實作都有相同政策。

解碼資料限 128 KiB、1000 欄位;文字最多 524288 字元,Base64 最多 174764,Hex 只接受完整位元組及 ASCII 空格、tab、換行。取 payload slice 前先檢查長度。每頁最多 50 欄位,payload 預覽明確標示,完整 JSON 保留全部欄位與位元組。修改輸入會清除舊結果,不上傳、不儲存、不寫入網址。

資料可信度

資料來源