2015-09-22 22 views
5

Tôi có một FixMessage và tôi muốn tính toán CheckSum bằng tay.Cách tính toán CheckSum trong Khắc phục thủ công?

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

Các bodylength đây được tính:

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) 

checksum là 157 (10 = 157). Làm thế nào để tính toán nó trong trường hợp này?

Trả lời

6

Bạn cần tổng hợp mọi byte trong thông báo lên đến nhưng không bao gồm trường kiểm tra. Sau đó, lấy số này là modulo 256 và in số đó là một số 3 ký tự có số 0 đầu (ví dụ: checksum = 13 sẽ trở thành 013).

Link từ wiki FIX: FIX checksum

An thực hiện ví dụ trong C: example

+0

"sum mỗi byte trong thông điệp ". Bạn có thể viết nó trong trường hợp này? – anhtv13

+0

@ANguyen đã chỉnh sửa bằng liên kết & ví dụ –

+0

Tôi vẫn không hiểu ví dụ đó. Tôi viết C#. Nếu tôi có FixMessage: {8 = FIX.4.29 = 4935 = 534 = 149 = ARCA52 = 20150916-04: 14: 05.30656 = TW10 = 157}. Làm thế nào để đếm nó đến 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

Ghi chú 1: Người seperator trong thông báo FIX là ký tự SOH; không phải | biểu tượng (biểu tượng ống). Giá trị byte của ký tự SOH là 1. Thay vì '" 8 = FIX.4.2 | ... "' write '" 8 = FIX.4.2 \ u0001 ... "' –

+2

Ghi chú 2: Để có được một byte thích hợp- mảng của một chuỗi, vui lòng tham khảo [FieldBase.phương thức getTotal trong thư viện QuickFIX/N] (https://github.com/connamara/quickfixn/blob/master/QuickFIXn/Fields/FieldBase.cs). Về cơ bản dòng 'byte [] bs = GetBytes (s);' nên trở thành 'byte [] bs = System.Text.Encoding.UTF8.GetBytes (s);' –

+0

Ok, cảm ơn. Tôi hiểu. – anhtv13

1

Ready-to-run C dụ chuyển thể từ 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); 
} 

điểm chú

  • GenerateCheckSum mất toàn bộ thông điệp FIX trừ checksum lĩnh vực
  • Delimiter SOH được viết như \001 trong đó có ASCII value1
Các vấn đề liên quan