Saltar al contenido

¿Cómo calcular CheckSum en FIX manualmente?

Solución:

Debe sumar cada byte del mensaje hasta el campo de suma de comprobación, pero sin incluirlo. Luego tome este número módulo 256 e imprímalo como un número de 3 caracteres con ceros a la izquierda (por ejemplo, suma de comprobación = 13 se convertiría en 013).

Enlace de la wiki de FIX: suma de comprobación FIX

Una implementación de ejemplo en C, tomada de onixs.biz:

char *GenerateCheckSum( char *buf, long bufLen )
{
    static char tmpBuf[ 4 ];
    long idx;
    unsigned int cks;

    for( idx = 0L, cks = 0; idx < bufLen; cks += (unsigned int)buf[ idx++ ] );
    sprintf( tmpBuf, "%03d", (unsigned int)( cks % 256 ) );
    return( tmpBuf );   
}

Ejemplo de C listo para funcionar adaptado de aquí

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: %3un", buf[i], val); // print value of each byte
        }
        printf("CheckSum = %03dn", (unsigned)( sum % 256 ) ); // print result
}

int main()
{
    char msg[] = "8=FIX.4.2019=490135=50134=10149=ARCA0152=20150916-04:14:05.3060156=TW01";
    int len = sizeof(msg) / sizeof(msg[0]);
    GenerateCheckSum(msg, len);
}

Puntos a tener en cuenta

  • GenerateCheckSum toma todo el mensaje FIX excepto el campo CheckSum
  • El delimitador SOH se escribe como 01 que tiene valor ASCII 1
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *