代码之家  ›  专栏  ›  技术社区  ›  anhtv13

如何手动计算FIX中的校验和?

  •  12
  • anhtv13  · 技术社区  · 9 年前

    我有一个 FixMessage 我想手动计算校验和。

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

    此处计算的体长为:

    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)
    

    校验和为157(10=157)。在这种情况下如何计算?

    4 回复  |  直到 4 年前
        1
  •  9
  •   TT.    4 年前

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

    来自FIX wiki的链接: FIX checksum

    C语言中的示例实现,取自 onixs.biz :

    char *GenerateCheckSum( char *buf, long bufLen )
    {
        static char tmpBuf[ 4 ];
        long idx;
        unsigned int cks;
    
        for( idx = 0L, cks = 0; idx < bufLen; cks += (unsigned int)buf[ idx++ ] );
        sprintf( tmpBuf, "%03d", (unsigned int)( cks % 256 ) );
        return( tmpBuf );   
    }
    
        2
  •  5
  •   Community holdenweb    7 年前

    准备运行C示例改编自 here

    8=修复。4.2 |9=49 | 35=5 | 34=1 | 49=ARCA | 52=20150916:4:4:5.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);
    }
    

    注意事项

        3
  •  3
  •   anhtv13    9 年前
    static void Main(string[] args)
        {
            //10=157
            string s = "8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|";
            byte[] bs = GetBytes(s);
            int sum=0;
            foreach (byte b in bs)
                sum = sum + b;
            int checksum = sum % 256;
        }
        //string to byte[]
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }
    
        4
  •  0
  •   BalajiDevkatte    3 年前

    使用BodyLength[9]和CheckSum[10]字段。 BodyLength从BodyLenght之后的字段开始计算 在CheckSum字段之前。 校验和在校验和字段之前从8=到SOH计算。 计算每个字符的二进制值,并将其与计算值的LSB与校验和值进行比较。 如果校验和被计算为274,则模256值为18(256+18=274)。该值将以10=018传输,其中 “10=”是校验和字段的标记。