二進位校驗和是一個位元組的錯誤偵測值,使用透明且可逆的公式(例如 XOR-8 BCC 或 Modbus ASCII LRC)從一串原始位元組計算得出。若要計算二進位校驗和,請選擇通訊協定所使用的輸入表示方式(UTF-8 文字或十六進位位元組),輸入校驗和預期涵蓋的完整酬載,執行計算,然後複製與裝置說明書相符的標籤結果。校驗和計算機在瀏覽器中本地完成此運算,並在同一組位元組序列上提供三個具名的八位元值——XOR-8 BCC、Modbus ASCII 縱向冗餘檢查(位元組總和的二補數),以及原始位元組總和模 256——因此在傳送訊框之前,您可以將每個候選值與廠商規格進行比對。不同於密碼學雜湊,這些單位元組校驗值體積小、易於在微控制器上計算,也易於手動驗證,但它們只能偵測意外變更,無法偵測蓄意竄改。

「二進位校驗和」對位元組串的真正意義
此處的「二進位」一詞意指「以原始位元組進行運算」,而非「以二進位數字系統表示」。因此,二進位校驗和是從一段位元組緩衝區——每個位元組八個位元、無文字解讀、除公式所需外不使用帶正負號運算——衍生出的短值。這個限定詞很重要,因為搜尋二進位校驗和的工程師通常正在查看串列訊框、Modbus 請求或廠商提供酬載的十六進位傾印,並希望取得一個可貼入該訊框尾端位元組的特定小數值。
「校驗和」一詞在業界同樣有多重含義。不同裝置將其用於表示加法總和、XOR 區塊檢查字元、縱向冗餘檢查、某種寬度的 CRC,或密碼學雜湊。許多廠商手冊從未指明所使用的演算法,還有部分廠商將 BCC 或 LRC 縮寫保留給其他廠商用於不同公式的演算法。將「校驗和」視為單一通用演算法,是訊框不符的最常見單一原因。安全的做法是先從說明書中識別輸入位元組表示方式、校驗和寬度、初始值、涵蓋欄位、任何最終的補數運算,以及傳輸的位元組順序,再選擇工具。
計算機所提供的三個八位元公式
校驗和計算機始終會在同一組位元組序列上回報三個明確的值。在將任何值複製到訊框之前,了解每個值背後的公式可讓您判斷哪一個符合您的目標。
- XOR-8 BCC:一個八位元累加器從 0x00 開始,依序對每個選定的位元組進行 XOR 運算。XOR 具有交換性,因此位元組順序不影響結果,且沒有進位需要追蹤。最後的累加器值即為結果。
- Modbus ASCII LRC:將每個訊息位元組加入一個八位元欄位,丟棄從第 8 位溢出的進位,結果為該總和的二補數。等價地,結果等於位元組總和取模 256 後的負值。官方的 Modbus 串列線路指南排除起始冒號與結尾的 CRLF,不將其納入提供給此公式的位元組。
- Sum modulo 256:普通位元組總和的原始低八位元,於 Modbus 二補數步驟之前。顯示為診斷用的中間值;總和與 LRC 在模 256 下恆為零。
| 公式 | 初始值 | 運算 | 最終轉換 | 訊框範圍 |
|---|---|---|---|---|
| XOR-8 BCC | 0x00 | 每個位元組 XOR | 無 | 廠商定義的酬載位元組 |
| Modbus ASCII LRC | 0x00 | 每個位元組相加,丟棄進位 | 二補數 | 訊息主體,不含冒號或 CRLF |
| Sum modulo 256 | 0x00 | 每個位元組相加,丟棄進位 | 無 | 與加法輸入相同 |
此表為定性說明——工具中三個結果欄位內的精確數值是由頁面本身依據您輸入的位元組所產生。請將公式視為合約,將此表視為快速參考,以判斷哪個公式適用於哪種框架。
如何從十六進位位元組或文字計算二進位校驗和
- 判斷您的通訊協定是將校驗和套用於 UTF-8 字串,還是套用於原始十六進位位元組。大多數裝置訊框與 Modbus 酬載使用原始位元組,因此十六進位輸入是最常見的選擇。若您貼上的是人類可讀的字串,請切換至文字模式,並記住瀏覽器會先將其編碼為 UTF-8;非 ASCII 字元可能會佔用數個位元組。
- 開啟校驗和計算機,選擇與您的訊框相符的輸入模式。該頁面會拒絕諸如 0x 前綴、逗號、冒號、破折號、奇數半位元組及註解等內容,而不是靜默猜測您的意圖。
- 準確輸入目標規格指定涵蓋的位元組。對於標準的 Modbus ASCII LRC,這表示不含起始冒號與結尾的歸位/換行字元組合的訊息主體。對於 XOR-8 BCC 檢查,這表示廠商指定的位元組——不多也不少。
- 執行計算。頁面會為三個值各顯示兩個小寫十六進位數字,以及已處理的位元組精確數量,因此您可以驗證位元組計數是否與您輸入欄位的長度相符。
- 將三個標籤結果與裝置說明書進行比對。複製相符的那個,然後將該標籤值(XOR-8 BCC、Modbus ASCII LRC,或 sum modulo 256)貼到訊框或測試記錄的結尾位置。
- 若結果遭到裝置拒絕,請先重新檢查位元組範圍,接著檢查該通訊協定是否對同一公式使用不同名稱、對同一名稱使用不同公式,或使用更寬的校驗和(例如 CRC-16 或 CRC-32)。
識別您的裝置或通訊協定所預期的公式
在信任任何輸出之前,請先從廠商說明書中回答六個問題:
- 輸入表示方式:酬載是 UTF-8 文字還是原始位元組?
- 校驗和寬度:是一個位元組、兩個位元組,還是四個位元組?
- 初始值:累加器是從零開始、從 0xFF 開始,還是從某個具名常數開始?
- 涵蓋欄位:校驗和僅涵蓋資料位元組,還是同時涵蓋長度欄位、位址欄位及功能碼?
- 最終轉換:結果是原樣傳送、取補數、反映,還是位元組交換?
- 傳輸位元組順序:在校驗和放入線路之前,高位元組與低位元組是否交換?
若任何答案不明確,請優先選擇能以純文字顯示其公式的工具。校驗和計算機在頁面上明列其三個公式,因此您可以在不猜測的情況下將每個輸出對應到已記載的演算法。關於兩個簡單八位元公式的深入逐步說明,請參閱指南如何計算 XOR-8 BCC 與 Modbus LRC,其中以長篇幅逐步涵蓋相同的演算法並重現其運算過程。
小段位元組序列的實作範例
為了讓三個公式更具體易懂,請採用六個位元組 01 03 00 00 00 0A——典型的 Modbus「讀取保持暫存器」請求主體。
- Sum modulo 256:0x01 + 0x03 + 0x00 + 0x00 + 0x00 + 0x0A = 0x0E = 十進位 14。低八位元為 0x0E。
- Modbus ASCII LRC:0x0E 的二補數。將 0x0E 反相得 0xF1,再加 1 得 0xF2。因此 LRC 為 0xF2。
- XOR-8 BCC:0x01 XOR 0x03 = 0x02,XOR 0x00 = 0x02,XOR 0x00 = 0x02,XOR 0x00 = 0x02,XOR 0x0A = 0x08。因此 BCC 為 0x08。
快速驗算:0x0E + 0xF2 = 0x100,而 0x100 模 256 = 0,這證實了加法總和與 LRC 在模 256 下恆為零。將同樣的六個位元組以十六進位模式貼入校驗和計算機,頁面會回報 0E、F2 與 08,以及六位元組計數,與上述手算結果一致。
限制與單位元組校驗和無法做到的事
單位元組校驗和刻意設計得短小。它們在小型微控制器上運算快速、易於目視驗證,且足以在平靜的串列線路上捕捉許多意外的位元翻轉。它們並非密碼學雜湊、訊息驗證碼、數位簽章或來源證明。XOR 與加法校驗和有許多碰撞——不同的位元組序列會產生相同的值——而能夠修改訊息的攻擊者通常可調整一兩個位元組以維持校驗和不變。
請勿將其用於保護憑證、授權命令、驗證軟體下載,或驗證敵對的網路流量。請使用實際通訊協定所要求的安全機制,例如用於訊息驗證的 HMAC、用於軟體的簽章,或用於敵對網路的 TLS。
校驗和計算機將輸入上限設為 500,000 位元組,拒絕靜默截斷,並在回報格式錯誤的十六進位內容時不產生部分值。若您的訊框遠大於此,或您需要 16 位元或 32 位元的值,則適合的工具是CRC-32 計算機或 HMAC 產生器,而非將不同公式輸入同一個頁面。對於本工具所實作的八位元 XOR-8 BCC 公式,廠商參考資料明確描述了該演算法,且頁面與該描述相符,因此複製的結果可以毫無歧義地與BALTECH XOR-8 BCC 參考資料進行交叉核對。
若您正在權衡各種選項,如何找到 CRC32:選擇正確的變體與位元組對此有詳細說明。