Как рассчитать контрольную сумму в Fix вручную?

У меня есть 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). Как его рассчитать в этом случае?

3 ответов


нужно, чтобы сумма всех байтов в сообщении до, но не включая поле контрольной суммы. Затем возьмите это число по модулю 256 и выведите его как число из 3 символов с начальными нулями (например, контрольная сумма=13 станет 013).

ссылка из Fix wiki:исправить контрольную сумму

пример реализации в C:пример


готовый к запуску пример 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.219=49135=5134=1149=ARCA152=20150916-04:14:05.306156=TW1";
    int len = sizeof(msg) / sizeof(msg[0]);
    GenerateCheckSum(msg, len);
}

Примечания


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;
    }