首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何手工计算FIX中的CheckSum?

如何手工计算FIX中的CheckSum?
EN

Stack Overflow用户
提问于 2015-09-22 03:53:58
回答 4查看 14.9K关注 0票数 12

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

代码语言:javascript
复制
8=FIX.4.2|9=49|35=5|34=1|49=ARCA|52=20150916-04:14:05.306|56=TW|10=157|

这里的身体长度计算如下:

代码语言:javascript
复制
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)。在这种情况下如何计算?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-22 09:22:04

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

来自修复wiki的链接:修正校验和

一个用C语言实现的示例,取自onixs.biz

代码语言:javascript
复制
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 );   
}
票数 9
EN

Stack Overflow用户

发布于 2016-11-10 15:59:02

准备运行的C示例,改编自 这里

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

代码语言:javascript
复制
#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);
}

指向Note

  • GenerateCheckSum接受除CheckSum字段以外的整个修复消息。
  • 划界器SOH被写成\001,其中有ASCII值 1
票数 5
EN

Stack Overflow用户

发布于 2015-09-24 02:46:52

代码语言:javascript
复制
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;
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32708068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档