如何手动计算Fix中的CheckSum?

anh*_*v13 10 quickfix fix-protocol

我有一个FixMessage,我想手动计算CheckSum.

8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157|
Run Code Online (Sandbox Code Playgroud)

这里的体长计算如下:

8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157|
0        + 0  + 5  + 5  + 8     + 26                     + 5   + 0  = 49(correct)
Run Code Online (Sandbox Code Playgroud)

checkSum是157(10 = 157).在这种情况下如何计算?

TT.*_*TT. 9

您需要对消息中的每个字节求和,但不包括校验和字段.然后取这个数模256,并将其打印为带有前导零的3个字符的数字(例如校验和= 13将变为013).

来自FIX wiki:FIX校验和的链接

C中的示例实现:示例


sam*_*sam 5

改编自此处的可立即运行的 C 示例

8=修复.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157|

#include <stdio.h>

void GenerateCheckSum( char *buf, long bufLen )
{
        unsigned sum = 0;
        long i;
        for( i = 0L; i < bufLen; i++ )
        {
            unsigned val = (unsigned)buf[i];
            sum += val;
            printf("Char: %02c Val: %3u\n", buf[i], val); // print value of each byte
        }
        printf("CheckSum = %03d\n", (unsigned)( sum % 256 ) ); // print result
}

int main()
{
    char msg[] = "8=FIX.4.2\0019=49\00135=5\00134=1\00149=ARCA\00152=20150916-04:14:05.306\00156=TW\001";
    int len = sizeof(msg) / sizeof(msg[0]);
    GenerateCheckSum(msg, len);
}
Run Code Online (Sandbox Code Playgroud)

注意事项

  • GenerateCheckSum获取除 CheckSum 字段之外的整个 FIX 消息
  • 分隔符 SOH写为\001ASCII值 1