Как рассчитать контрольную сумму в 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);
}
Примечания
-
GenerateCheckSum
принимает все сообщение об исправлении, кроме поля контрольной суммы -
разделитель SOH написано
1
имеющего значение ASCII1
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;
}