2015-09-22 13 views
5

Mam FixMessage i chcę obliczyć CheckSum ręcznie.Jak obliczyć CheckSum w Fix ręcznie?

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

bodylength tu obliczono:

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) 

suma kontrolna jest 157 (10 = 157). Jak obliczyć to w tym przypadku?

Odpowiedz

6

Należy sumować każdy bajt w komunikacie, ale nie uwzględniając pola sumy kontrolnej. Następnie weź ten numer modulo 256 i wydrukuj go jako liczbę 3 znaków z wiodącymi zerami (np. Suma kontrolna = 13 stanie się 013).

link z wiki FIX: FIX checksum

Przykładem implementacja w C: example

+0

„Sum każdy bajt w wiadomości ". Czy możesz napisać to w tym przypadku? – anhtv13

+0

@ANguyen edytowane za pomocą linku i przykładu –

+0

Nadal nie rozumiem tego przykładu. Piszę C#. Jeśli mam komunikat FixMessage: {8 = FIX.4.29 = 4935 = 534 = 149 = ARCA52 = 20150916-04: 14: 05.30656 = TW10 = 157}. Jak policzyć to do 157? – 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

Uwaga 1: Separator w komunikatach FIX jest znakiem SOH; nie | symbol (symbol rury). Wartość bajtu znaku SOH wynosi 1. Zamiast "8 = FIX.4.2 | ..." 'napisz' "8 = FIX.4.2 \ u0001 ..." ' –

+2

Uwaga 2: Aby uzyskać prawidłowy bajt tablica napisów, proszę odnieść się do [FieldBase.metoda getTotal w bibliotece QuickFIX/N] (https://github.com/connamara/quickfixn/blob/master/QuickFIXn/Fields/FieldBase.cs). Zasadniczo wiersz 'byte [] bs = GetBytes (s);' powinien stać się 'byte [] bs = System.Text.Encoding.UTF8.GetBytes (s);' –

+0

OK, dziękuję. Rozumiem. – anhtv13

1

Gotowy do biegu przykład C adaptacją 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); 
} 

Punkty zauważyć,

  • GenerateCheckSum zajmuje całą wiadomość FIX z wyjątkiem pola sumy kontrolnej
  • Delimiter SOH jest napisane jak \001 który ma ASCII value1