How to calculate CheckSum in Fix manually?

I have FixMessage and I want to calculate CheckSum manually.

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

The body length is calculated here:

 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) 

The checksum is 157 (10 = 157). How to calculate it in this case?

+6
source share
3 answers

You need to sum each byte in the message before, but not include the checksum field. Then take this number modulo 256 and print it as a 3-character number with leading zeros (for example, checksum = 13 will become 013).

FIX wiki link: FIX checksum

C implementation example : example

+7
source
 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; } 
+1
source

Ready to run C, e.g. adapted from here

8 = FIX.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); } 

Points for notes

+1
source

All Articles