
銀行批量代發工資、大額支付、跨行清算等核心業務,廣泛採用字符串報文作為異構系統間的數據交換格式。其優勢在於:可讀性強、跨平台無二進制兼容性問題、易於調試與人工干預、支持主機/小型機/PC 多端共存。
每個域佔固定字節位置,不足補空格/零。解析靠偏移量+長度。
記錄長度:32 字節
域結構:
[0:1] 序號 (1字節)
[1:14] 卡號 (13字節)
[14:20] 姓名 (6字節)
[20:32] 金額 (12字節,含小數點)
| 域名 | 長度 | 類型 | 示例值 |
|---|---|---|---|
| 序號 | 1 | 整型 | 1 |
| 卡號 | 13 | 字符串 | 9559901099999 |
| 姓名 | 6 | 字符串 | zyx |
| 金額 | 12 | 浮點型 | 1234.21 |
優點:解析極快(直接內存拷貝)、無分隔符衝突。
缺點:空間浪費(短值佔長位)、擴展困難(增域需改所有端)。
域間用特殊字符(|、,、\t)分隔,域長度可變。
1|9559901099999|zyx|1234.21
2|53591010988|huping|19732.01
優點:緊湊、易擴展、人類可讀性佳。
缺點:需轉義分隔符、解析需掃描字符串、不定長增加處理複雜度。
| 模式 | 結構示例 | 應用場景 |
|---|---|---|
| 固定長度嵌套分隔符 | [SEQ:1][DATA:zyx,1234.21 ][RESERVED:...] | 主記錄固定,明細靈活 |
| 分隔符嵌套固定長度 | 1|9559901099999|zyx 1234.21|...] | 主流程分隔,關鍵子域定長 |
| 定長域間加分隔符 | 0001|zyx |1234.21 | | 兼顧定位速度與可讀性 |
// 固定長度解析:內存映射結構體(注意對齊與端序)
#pragma pack(1)
typedef struct {
char seq[1];
char card[13];
char name[6];
char amount[12];
} FixedPayrollRec;
#pragma pack()
// 分隔符解析:狀態機或 strtok_r(線程安全)
char *saveptr;
char *token = strtok_r(line, "|", &saveptr); // seq
token = strtok_r(NULL, "|", &saveptr); // card
token = strtok_r(NULL, "|", &saveptr); // name
token = strtok_r(NULL, "|", &saveptr); // amount
// 混合模式:分層解析
// 1. 按外層分隔符切分主域
// 2. 對特定主域按內層規則(定長/再分隔)二次解析
字符串報文雖「古老」,仍是金融核心系統的主力協議。深入理解三大組織形式、兩大傳輸模式、解析器設計模式與工程化實踐,是金融級後台開發者的硬核基本功。