2015-09-22 14 views
5

Ich habe eine FixMessage und ich möchte CheckSum manuell berechnen.Wie CheckSum in Fix manuell berechnet?

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

Die Körperlänge ist hier berechnet:

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) 

Summe ist 157 (10 = 157). Wie berechnet man es in diesem Fall?

Antwort

6

Sie müssen jedes Byte in der Nachricht bis zum Prüfsummenfeld addieren, aber nicht. Dann nimm diese Zahl modulo 256, und drucke sie als eine Anzahl von 3 Zeichen mit führenden Nullen (z. B. Prüfsumme = 13 würde 013 werden).

Link von dem FIX-wiki: FIX checksum

Eine beispielhafte Implementierung in C: example

+0

„Summe hat in der Nachricht ". Kannst du es in diesem Fall schreiben? – anhtv13

+0

@ANguyen bearbeitet mit Link & Beispiel –

+0

Ich verstehe immer noch dieses Beispiel nicht. Ich schreibe C#. Wenn ich eine FixMessage habe: {8 = FIX.4.29 = 4935 = 534 = 149 = ARCA52 = 20150916-04: 14: 05.30656 = TW10 = 157}. Wie man es zu 157 zählt? – anhtv13

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

Anmerkung 1: Der Separator in FIX-Nachrichten ist das SOH-Zeichen; nicht das | Symbol (Rohrsymbol). Der Byte-Wert des SOH-Zeichens ist 1. Statt "8 = FIX.4.2 | ..." 'write' "8 = FIX.4.2 \ u0001 ..." ' –

+2

Bemerkung 2: Um ein richtiges Byte- Array eines Strings finden Sie in der [FieldBase.getTotal-Methode in der QuickFIX/N-Bibliothek] (https://github.com/connamara/quickfixn/blob/master/QuickFIXn/Fields/FieldBase.cs). Im Grunde genommen sollte die Zeile 'byte [] bs = GetBytes (s)' 'zu byte [] bs = System.Text.Encoding.UTF8.GetBytes (s) werden;' –

+0

Ok, danke. Ich verstehe. – anhtv13

1

Ready-to-run angepasst C Beispiel aus 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); 
} 

auf Anmerkung

  • GenerateCheckSum nimmt die gesamte FIX Nachricht außer Prüfsummenfeld
  • Delimiter SOH als \001 geschrieben, die jedes Byte ASCII value1