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 成對由那單一控制位元組分隔,把訊息當成十六進位位元組處理,通常是避免編碼歧義最乾淨的方式。

calculate checksum for fix message
計算 fix 訊息的檢查碼

計算機顯示的三個單一位元組值

計算機每一次執行都會處理你提供的精確位元組,並回傳三個不同的單一位元組結果。第一個是 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」值,下面的程序就足以產出可用結果。

  1. 開啟 Checksum Calculator,對任何含有 SOH(0x01)分隔符或非 ASCII 字元的 FIX 訊息選 Hex 輸入模式;只有在位元組保證是可列印 ASCII 時,才改用 Text
  2. 組出 FIX 規格指派給檢查碼的位元組序列:從 BeginString(標籤 8)之後那個 SOH 後面的第一個位元組起,到標籤 10 之前那個 SOH 為止。省略「10=」標籤及其值,也省略訊息最後的 SOH。
  3. 把該位元組序列轉成十六進位。把每個位元組寫成恰好兩位十六進位數字,位元組之間用單一空白以利閱讀。不要包含 0x 前綴、逗號、冒號、破折號或註解——剖析器會拒絕那些。
  4. 把十六進位貼進計算機的輸入欄並執行計算。頁面會在三個結果旁邊回報處理的精確位元組數,讓你在採信任何值之前,確認位元組數對得上 FIX 規格。
  5. 讀取 Sum modulo 256 結果。把它表示成恰好兩位小寫十六進位數字(計算機已經這樣做,包含任何前導零),放在 FIX 訊息的「10=」之後,再接上最後的 SOH。
  6. 在接收端核對:取「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 留給它被打造出來的那件狹窄、定義清楚的工作:對已知位元組序列重現三個明確單一位元組公式之一,並把標了名稱的結果拿去對照裝置文件所載的期望。