Checksum Calculator 會為給定訊息產出三個標了名稱的單一位元組值——XOR-8 區塊檢查字元、Modbus ASCII 縱向冗餘檢查,以及原始位元組和對 256 取模——而 FIX 協定的標準檢查碼是其中第三個,也就是該欄位涵蓋的每個位元組算術和的低八位。要計算 FIX 訊息的檢查碼,請開啟 Checksum Calculator,挑選與位元組儲存方式相符的輸入模式,只貼上 FIX 規格指派給檢查碼欄位的那些位元組,並把對 256 取模的和結果複製成兩位小寫十六進位數字。計算機不會替你剖析 FIX 標籤、分隔符或訊框,也不宣稱 FIX 相容;它只是把明確公式攤開,讓你能自己對照 FIX 4.x 或 FIX 5.x 規格文件核對結果。因為 FIX 訊息在欄位之間使用 SOH(0x01),且 tag=value 成對由那單一控制位元組分隔,把訊息當成十六進位位元組處理,通常是避免編碼歧義最乾淨的方式。

計算機顯示的三個單一位元組值
計算機每一次執行都會處理你提供的精確位元組,並回傳三個不同的單一位元組結果。第一個是 XOR-8 區塊檢查字元(BCC),從零開始,把每個選定位元組 XOR 進八位元累加器;因為 XOR 符合交換律,位元組順序不改變此值。第二個是 Modbus ASCII 縱向冗餘檢查(LRC),把每個位元組加進八位元欄位,丟棄離開該位元組的任何進位,再回傳該和的二補數。第三個是原始位元組和對 256 取模,也就是在二補數步驟之前,普通算術和的低八位。Modbus LRC 與原始和相加永遠對 256 為零,因此兩個值並排來看,很容易看出特定裝置實際期望哪一個。
| 演算法 | 起始值 | 每個位元組的運算 | 最後步驟 | 典型用途 |
|---|---|---|---|---|
| XOR-8 BCC | 0x00 | XOR 進累加器 | 無 | 廠商專用序列訊框;請對照裝置文件確認 |
| Modbus ASCII LRC | 0x00 | 加進累加器,丟棄進位 | 二補數 | Modbus ASCII 訊息,不含 ':' 與 CRLF |
| Sum modulo 256 | 0x00 | 加進累加器,丟棄進位 | 無 | FIX 協定 CheckSum 欄位;加總慣例的診斷用途 |
計算機不會替你挑選這些值的其中一個。它用明確標籤把三個都攤開,讓位元組解讀、演算法與最終轉換能逐行對上目標規格。
為訊息選擇文字或十六進位輸入
在 UTF-8 文字模式下,瀏覽器會在加總任何位元組之前先把貼上的字串編成 UTF-8,因此帶變音的字母或表情符號這類非 ASCII 字元每個都會貢獻數個位元組,顯示的位元組數很容易超過可見字元數。在十六進位模式下,你把每個位元組輸入成恰好兩位十六進位數字,位元組之間可有選擇性空白;像 0x 這樣的前綴、逗號、冒號、破折號、奇數半位元組與註解會被拒絕,而不是被靜默猜出來。對典型 FIX 訊息,十六進位路徑幾乎一律是較安全的選擇,因為每個欄位都是 tag=value<0x01>tag=value<0x01>...,而那個內嵌的 SOH 位元組,若你把訊息貼過任何把它當純文字處理的工具,就可能遺失或被弄壞。若你需要逐步走完此處所用的原始位元組視角,二進位檢查碼指南 從那個角度涵蓋同一台計算機。
若你的來源 FIX 訊息已經是乾淨的 ASCII 字串,沒有真正的編碼漂移風險,文字模式就沒問題,讓你貼上而不必手動把每個欄位轉成十六進位。唯一安全的規則是:若位元組含有普通可列印 ASCII 以外的任何東西——包括 0x01 SOH 分隔符、內嵌空位元組,或較長 FIX 欄位裡的非 ASCII 字元——請改用十六進位模式,把位元組輸入成成對的十六進位數字,讓計算機看到的恰好是接收端會看到的。
計算 FIX 訊息檢查碼
FIX 規格把 CheckSum 欄位(標籤 10)定義為從 BeginString 欄位之後第一個字元起,到緊接在 CheckSum 欄位本身之前那個 SOH 位元組為止,每個位元組對 256 取模的和。因為該定義直接對上計算機的「Sum modulo 256」值,下面的程序就足以產出可用結果。
- 開啟 Checksum Calculator,對任何含有 SOH(0x01)分隔符或非 ASCII 字元的 FIX 訊息選 Hex 輸入模式;只有在位元組保證是可列印 ASCII 時,才改用 Text。
- 組出 FIX 規格指派給檢查碼的位元組序列:從 BeginString(標籤 8)之後那個 SOH 後面的第一個位元組起,到標籤 10 之前那個 SOH 為止。省略「10=」標籤及其值,也省略訊息最後的 SOH。
- 把該位元組序列轉成十六進位。把每個位元組寫成恰好兩位十六進位數字,位元組之間用單一空白以利閱讀。不要包含 0x 前綴、逗號、冒號、破折號或註解——剖析器會拒絕那些。
- 把十六進位貼進計算機的輸入欄並執行計算。頁面會在三個結果旁邊回報處理的精確位元組數,讓你在採信任何值之前,確認位元組數對得上 FIX 規格。
- 讀取 Sum modulo 256 結果。把它表示成恰好兩位小寫十六進位數字(計算機已經這樣做,包含任何前導零),放在 FIX 訊息的「10=」之後,再接上最後的 SOH。
- 在接收端核對:取「8=」之後到「10=」之前那個 SOH 為止的每個位元組,對 256 取模加總,並確認結果等於放在標籤 10 的值。
作為演算範例,取「HELLO」的 ASCII 位元組,也就是 48 45 4c 4c 4f。把它們相加得到 72 + 69 + 76 + 76 + 79 = 372,而 372 mod 256 = 116,也就是 0x74。同一組五個位元組的 XOR-8 BCC 是 0x42 (0x48 ^ 0x45 = 0x0D; 0x0D ^ 0x4C = 0x41; 0x41 ^ 0x4C = 0x0D; 0x0D ^ 0x4F = 0x42)。Modbus ASCII LRC 是 0x74 的二補數,也就是 0x8C。核對 0x74 + 0x8C = 0x100,和與 LRC 相加正好是一個位元組進位,正如演算法所保證。
把計算機輸出對上 FIX 規格
不同協定使用「checksum」或「BCC」這些詞時,意思並不相同,因此唯一安全的交叉核對,是讀目標規格並確認四點:哪些位元組屬於檢查碼、起始值是什麼、執行什麼算術,以及是否套用最終轉換。下表摘要此計算機所實作公式的典型定義;FIX 列對上計算機的「Sum modulo 256」輸出,Modbus ASCII 列對上計算機的「Modbus ASCII LRC」輸出。
| 協定 | 檢查碼涵蓋的位元組 | 排除的訊框 | 輸出轉換 |
|---|---|---|---|
| FIX 4.x / 5.x CheckSum | 從「8=」之後到「10=」之前那個 SOH 為止的所有位元組 | BeginString 本身;標籤 10 及其值 | Sum mod 256 |
| Modbus ASCII LRC | ':' 與 CRLF 之間的所有位元組 | 開頭的 ':' 與結尾的 CRLF | 二補數 |
| 廠商 BCC(XOR-8) | 依廠商文件 | 依廠商文件 | 無(僅 XOR)——見 BALTECH XOR-8 參考 |
若你的裝置文件描述的是 CRC-16、CRC-32、Fletcher、Adler、Internet checksum,或任何具名的密碼學雜湊,此處產出的三個值都不會對上裝置所期望的,即使手冊裡可能出現「checksum」或「BCC」這些詞。
上限、錯誤處理與安全邊界
計算機每次執行最多處理 500,000 個位元組,且不會靜默截斷更長的輸入;輸出面板會回報實際位元組數,因此過大的貼上會明確失敗,而不是產出悄悄算錯的答案。格式錯誤的十六進位——奇數半位元組、多餘前綴、多餘分隔符、註解——會整段拒絕,且不顯示部分值,以免一次糟糕的貼上被誤當成真正的檢查碼。每個結果一律呈現為恰好兩位小寫十六進位數字,包含前導零,因此輸出可以直接貼進 FIX 標籤,接收端不會有大小寫敏感問題。
這三個值都不是密碼學雜湊、訊息鑑別碼、數位簽章、加密,或來源證明。XOR 與加總檢查碼有許多碰撞——許多不同輸入共用同一個單一位元組值——而且控制酬載的攻擊者可以調整一個位元組來讓總和維持不變。不要依賴單一位元組檢查碼來保護憑證、授權 FIX 訂單、核對軟體下載,或鑑別任何穿越不可信網路的訊息。請用實際 FIX 工作階段層或傳輸所要求的安全機制——例如 TLS、簽署的 FIXML,或硬體安全模組——而不是把欄位 10 當成竄改偵測器。
這台計算機何時是錯的工具
一旦目標規格點名任何比此處實作的公式更寬、更有結構,或密碼學上更強的東西,就改用別的工具。CRC-16/Modbus、CRC-32/ISO-HDLC、Fletcher-16、Adler-32、TCP 與 IPv4 標頭所用的一補數 Internet checksum,以及任何 SHA-2 系列摘要,都超出範圍;計算機沒有實作它們,也不會從脈絡去猜。若你的 FIX 部署需要超出內建標籤 10 的工作階段層完整性檢查,請看專用的 CRC 或雜湊工具——CRC 檢查碼指南 說明如何辨識那種情況,並改用 CRC 計算機。
若你需要核對下載檔、韌體映像檔或軟體套件的完整性,同樣適用。單一位元組加總檢查碼的碰撞太多,抓不住蓄意竄改;那種情況,廠商發布的 SHA-256 摘要才是最低限度合適的完整性檢查。把 Checksum Calculator 留給它被打造出來的那件狹窄、定義清楚的工作:對已知位元組序列重現三個明確單一位元組公式之一,並把標了名稱的結果拿去對照裝置文件所載的期望。