IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Recoder le calcul d'un CRC32b depuis le langage C [WD20]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut Recoder le calcul d'un CRC32b depuis le langage C
    Bonjour à tous,

    Je me tourne vers vous car je dois bien avouer que je cale sur un sujet qui me "semble" pourtant simple... Je m'explique.

    Dans le cadre d'un développement, je dois implémenter un dialogue avec un TPE sur un protocole qui n'est pas CONCERT. JE le précise car j'ai déjà vu beaucoup de topics sur ce sujet. Le protocole en question doit rester confidentiel, je ne peux donc être que succin dans les informations que je transmet. La communication s'effectue via port Série, fonction sOuvre, etc... Ce protocole nécessite le calcul d'un CRC32. Ce calcul du CRC , selon la documentation fournie pour le protocole ET les essais que j'ai effectués, ne semble pas se limiter à la fonction sCalculeCrc32 de WD.

    Donc, la documentation fourni un exemple de fonction effectuant le calcul demandé que vous pourrez trouver à l'ANNEXE 1 . Ce code est en C et, même si cela fait très longtemps que je n'en ai pas fait, je pense l'avoir compris.

    J'ai donc tenté de le recoder en WD mais sans résultat ( code source dans l'ANNEXE 2 ).

    Pour l'exemple :
    la donnée d'entrée est : 00 05 6E 6C 65 6E 33 30 30 30 33 32 32 38 31 37 31 37 32 39 33 37 33 31 33 30 33 31 30 36 36 38 30 31 39 32 33 36 32 36
    la donnée attendue après le calcul du CRC est : 5C A4 C5 7F

    Je dois bien avouer que je ne trouve rien de correspondant... Je suis ouvert à toute proposition / correction / amélioration / baffe car j'avoue que je m'arrache les cheveux sur ce problème là

    ANNEXE 1
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    /*-
    * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
    * code or tables extracted from it, as desired without restriction.
    *
    * First, the polynomial itself and its table of feedback terms. The
    * polynomial is
    * X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
    *
    * Note that we take it "backwards" and put the highest-order term in
    * the lowest-order bit. The X^32 term is "implied"; the LSB is the
    * X^31 term, etc. The X^0 term (usually shown as "+1") results in
    * the MSB being 1
    *
    * Note that the usual hardware shift register implementation, which
    * is what we're using (we're merely optimizing it by doing eight-bit
    * chunks at a time) shifts bits into the lowest-order term. In our
    * implementation, that means shifting towards the right. Why do we
    * do it this way? Because the calculated CRC must be transmitted in
    * order from highest-order term to lowest-order term. UARTs transmit
    * characters in order from LSB to MSB. By storing the CRC this way
    * we hand it to the UART in the order low-byte to high-byte; the UART
    * sends each low-bit to hight-bit; and the result is transmission bit
    * by bit from highest- to lowest-order term without requiring any bit
    * shuffling on our part. Reception works similarly
    *
    * The feedback terms table consists of 256, 32-bit entries. Notes
    *
    * The table can be generated at runtime if desired; code to do so
    * is shown later. It might not be obvious, but the feedback
    * terms simply represent the results of eight shift/xor opera
    * tions for all combinations of data and CRC register values
    *
    * The values must be right-shifted by eight bits by the "updcrc
    * logic; the shift must be unsigned (bring in zeroes). On some
    * hardware you could probably optimize the shift in assembler by
    * using byte-swap instructions
    * polynomial $edb88320
    *
    *
    * CRC32 code derived from work by Gary S. Brown.
    */
     
    #include <sys/param.h>
    #include <sys/systm.h>
    static uint32_t crc32_tab[] =
    {
    	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
    	0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
    	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
    	0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
    	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
    	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
    	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
    	0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
    	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
    	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
    	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
    	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
    	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
    	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
    	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
    	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
    	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
    	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
    	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
    	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
    	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
    	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
    	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
    	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
    	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
    	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
    	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
    	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
    	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
    	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
    	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
    	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
    	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
    	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
    	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
    	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
    	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
    	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
    	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
    	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
    	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
    	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
    	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
    };
     
    uint32_t crc32(uint32_t crc, const void *buf, size_t size)
    {
    	const uint8_t *p;
    	p = buf;
    	crc = crc ^ ~0U;
    	while (size--)
    	{
    		crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
    	}
    	return crc ^ ~0U;
    }
     
    /* This example code was located at http://www.opensource.apple.com/source/xnu/xnu-
    1456.1.26/bsd/libkern/crc32.c */

    ANNEXE 2
    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
     
     
    tab_Data est un tableau de chaînes
    tab_CRC_Obtenu est un tableau de chaînes
     
    n_A est un entier sur 4 octets sans signe
    n_B est un entier sur 4 octets sans signe
    n_C est un entier sur 4 octets sans signe
    n_D est un entier sur 4 octets sans signe
    n_CRC est un entier sur  4 octets sans signe
     
    crc32_tab est un tableau d'entiers sur  4 octets sans signe
     
    //Etant donné que la communication s'effectue octet par octet,
    // les donnée dont on doit trouver le CRC sont stockées sous
    // forme de chaine dans le tableau tab_Data. Pour retrouver
    // la valeur de l'octet, il suffit d'effectuer un VAL( donnée, "x")
     
    //Data : 00 05 6E 6C 65 6E 33 30 30 30 33 32 32 38 31 37 31 37 32 39 33 37 33 31 33 30 33 31 30 36 36 38 30 31 39 32 33 36 32 36	
    //CRC attendu : 5C A4 C5 7F
     
    TableauAjoute(tab_Data, "00")
    TableauAjoute(tab_Data, "05")
    TableauAjoute(tab_Data, "6E")
    TableauAjoute(tab_Data, "6C")
    TableauAjoute(tab_Data, "65")
    TableauAjoute(tab_Data, "6E")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "32")
    TableauAjoute(tab_Data, "32")
    TableauAjoute(tab_Data, "38")
    TableauAjoute(tab_Data, "31")
    TableauAjoute(tab_Data, "37")
    TableauAjoute(tab_Data, "31")
    TableauAjoute(tab_Data, "37")
    TableauAjoute(tab_Data, "32")
    TableauAjoute(tab_Data, "39")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "37")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "31")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "31")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "36")
    TableauAjoute(tab_Data, "36")
    TableauAjoute(tab_Data, "38")
    TableauAjoute(tab_Data, "30")
    TableauAjoute(tab_Data, "31")
    TableauAjoute(tab_Data, "39")
    TableauAjoute(tab_Data, "32")
    TableauAjoute(tab_Data, "33")
    TableauAjoute(tab_Data, "36")
    TableauAjoute(tab_Data, "32")
    TableauAjoute(tab_Data, "36")
     
    crc32_tab = [...
    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,...
    0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,...
    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,...
    0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,...
    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,...
    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,...
    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,...
    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,...
    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,...
    0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,...
    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,...
    0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,...
    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,...
    0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,...
    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,...
    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,...
    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,...
    0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,...
    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,...
    0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,...
    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,...
    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,...
    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,...
    0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,...
    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,...
    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,...
    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,...
    0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,...
    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,...
    0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,...
    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,...
    0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,...
    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,...
    0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,...
    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,...
    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,...
    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,...
    0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,...
    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,...
    0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,...
    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,...
    0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,...
    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d...
    ]
     
    //crc = crc ^ ~0U;
    //n_CRC = OUExclusifBinaire(n_CRC, 0x00000000) <= Ligne d'origine, corrigée suite à la réponse de frenchsting
    // Cf. https://stackoverflow.com/questions/26555159/what-does-the-assignment-of-0u-to-a-variable-mean-in-c
    n_CRC = OUExclusifBinaire(n_CRC, 0xFFFFFFFF)
     
    //while (size--) <= On part de la fin du buffer pour aller au début
    POUR n_Indice = tab_Data..Occurrence _A_ 1 PAS -1
     
    	// On va décomposer les étapes trouvées dans le code en C pour plus de clarté
     
    	// A = crc ^ *p++
    //	n_A = OUExclusifBinaire(n_CRC, Val(tab_Data[n_Indice],"x"))
    	n_A = n_CRC || Val(tab_Data[n_Indice],"x")
     
    	// B = A  & 0xFF
    //	n_B = ETBinaire(n_A, 0xFF)
    	n_B = n_A & 0xFF
     
    	// C = crc32_tab[B]
    	n_C = crc32_tab[n_B + 1]	//=> +1 parceque quand tu traduis du C en WinDev, tu commences les tableaux à 1
     
    	// D = crc >> 8
    //	n_d = n_CRC bitDécaleDroite(8)
    	n_D = n_CRC bitDécaleDroite 8
     
    	// CRC = C ^ D
    //	n_CRC = OUExclusifBinaire(n_C, n_D)
    	n_CRC = n_C || n_D
     
    FIN
     
    //return crc ^ ~0U
    //n_CRC = OUExclusifBinaire(n_CRC, 0x00000000) <= Ligne d'origine, corrigée suite à la réponse de frenchsting
    // Cf. https://stackoverflow.com/questions/26555159/what-does-the-assignment-of-0u-to-a-variable-mean-in-c
    n_CRC = OUExclusifBinaire(n_CRC, 0xFFFFFFFF)
     
    ChaîneVersTableau(EntierVersHexa(n_CRC, 2),tab_CRC_Obtenu," ")
     
    //CRC attendu : 5C A4 C5 7F
     
    STOP

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Hello mordessa,

    une des raisons pour lesquelles j'aime le C, c'est que c'est très compact. Une raison pour lesquelles je n'aime pas le C, c'est que c'est très compact...

    Blague à part, j'ai un doute sur ton ouexclusif. Pour moi, ton n_CRC = OUExclusifBinaire(n_CRC, 0x00000000) doit toujours renvoyer n_CRC. Comme dans le code en C, c'est écrit crc = crc ^ ~0U; il doit y avoir un os dans la traduction C vers Windev. Je ne pourrai pas t'aider là-dessus, mes connaissances en C remontent au calandes grecques...

    En plus, les gentils pointeurs (chaines ?) sont sur 8 bits ? et la variable crc sur 32 ? Ca met pas le brin ?

    As-tu la possibilité de trouver ce bout de code en delphi (qui est beaucoup plus propre du côté du typage, je trouve) ?
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    Merci de ta réponse frenchsting,

    Je ne peux malheureusement pas avoir de Delphi pour ce morceau de code puisqu'il m'est fourni tel que je le donne ici dans la doc et que c'est tout ce qu'on me donne...

    Par contre, pour le OUBinaire, j'ai cherché un peu et suis tombé sur ce post sur Stack Overflow.

    Si j'en ai bien compris la teneur, il semblerait que l'utilisation de "~0u" équivaut à mettre tous les bits à 1. Donc, pour n_CRC (entier sur 4 octets), cela revient à faire un OUExclusifBinaire ( => ^ ) avec 0xFFFFFFFF, en gros, à inverser tous les bits en somme. Mais même en changeant cette partie là, je n'obtiens rien de ce que je voudrais...

    Pour ce qui est des pointeurs 8 bits en comparaison du CRC sur 32, je n'ai pas de souci avec ca puisqu'une valeur hexadécimale ( 0xEF par exemple) est codées sur 8 bits et que l'on parcours la donnée envoyée octet par octet. Le pointeur est donc sensé faire 8 bits (un octet du coup). Le décalage à droite de 8 doit aussi entrer dans la danse au passage mais la facilité que j'ai a comprendre toutes ces opérations binaires est proche du néant... A chaque fois je dois me remettre dans la logique du truc... alors c'est plus complexe encore !

  4. #4
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Pour info, cette inversion s'appelle le complément à 1.

    Par contre, dans ton code je ne trouve pas le pointeur p qui doit être une chaine qui est parcourue caractère par caractère dans la boucle (*p++)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    Pour le pointeur caractère par caractère, je l'ai remplacé. En fait, le buffer du code d'origine est devenu un tableau (il a bien grandi!).

    Dans ce tableau de chaines "tab_Data" est stocké chacun des octets à transmettre sous forme de chaine. Lorsque je dois envoyer 0xEF, j'y inscris "EF".

    Dans mon code, on voit cela :
    Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
    POUR n_Indice = tab_Data..Occurrence _A_ 1 PAS -1
    puis plus bas
    Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
    Val(tab_Data[n_Indice],"x")

    C'est mon équivalence pour le pointeur. Ca se tient ? Ca permet de "visualiser" plus facilement en débug les octets qui vont être envoyés.

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Dans ton code Windev, ligne 122, tu as une concaténation. Dans une version précédente, tu avais un OuBinaire ( ligne 121, mise en commentaire). La version avec le OuBinaire me semble mieux.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    J'ai justement mis les deux syntaxes parcequ'elles sont équivalentes et donnent le même résultat à chaque fois. Qui plus est, c'est écrit texto dans la doc PCSoft concernant les opérateurs binaires

  8. #8
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Oui, ça me va.

    Par contre, ça : n_CRC || Val(tab_Data[n_Indice],"x"), ça fait quoi ? Ton val(..) te renvoie une valeur de quelle taille 8 ou 16 ou 32 ?
    Apparemment, dans la doc Windev on ne peut pas avoir d'opérande ni de résultat supérieur à 8 octets. https://doc.pcsoft.fr/?1512009&name=operateurs_binaires.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    Ah ca... je n'y avait pas songé... Possible que ca joue sur le résultat... peut-être faudrait-il faire le "OU" sur les 8 bits faibles et remettre tout ensemble après ?

  10. #10
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    c'est sûr que cela fausse le résultat.

    Oui, il faut découper ta chaîne, ou faire toi même une procédure de ouexclusif. Rien de bien sorcier lorsque l'on maîtrise le C comem toi.

    J'opterais pour la création de la procédure, qui te permettra de voir tes chaînes de bits.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    Bonjour et désolé pour la réponse tardive,

    J'ai eu quelques urgences qui m'ont pris du temps, d'ou l'absence de réponse de ma part. Ceci dit, j'avais aussi demandé à un collègue de poster le problème sur le forum de PCSoft et j'ai eu une réponse qui a l'air tout à fait prometteuse !!! Pour ne pas dire qu'elle semble régler le problème.

    Voici le lien du post : https://forum.pcsoft.fr/fr-FR/pcsoft...ngage/read.awp

    Je ne peux pas me pencher sur la question étant donné mes obligations actuelles mais je me remet dessus aux alentours du 10 juillet. Je reviendrai ici pour donner des nouvelles et poster le code correct Je vous invite, pour les intéressés, à consulter le post

    A tout bientôt amis développeurs !

    PS : il semblerait que l'erreur provienne d'une mauvaise interprétation du C et d'une mauvaise utilisation de la fonction de calcul du CRC fournie avec WD

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    +1 pour le retour.

    Bon courage
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    Me revoilà !

    J'ai de nouveau du temps à passer sur ce sujet.

    Alors, je reprend ce que je disais précédemment, la réponse au calcul m'a été donnée sur le forum de PCSoft => https://forum.pcsoft.fr/fr-FR/pcsoft...ngage/read.awp

    Je ne vais pas vous laisser relire tout, je vais déjà vous donner le code corrigé qui permet le calcul du "CRC32b". Ce code a donc été validé par la personne qui m'a répondu (et par moi-même), il est fonctionnel. Ci-dessous une citation de l'utilisateur qui m'a répondu :
    Je viens de vérifier, le polynôme utilisé dans le code C est celui du CRC-32-IEEE802.3 le même que Windev
    Pour la chaine : "nlen3000322817172937313031066801923626"
    le programme C donne : 0x0A8B2101
    windev donne : 0x0A8B2101
    le site https://crccalc.com/ donne : 0x0A8B2101
    le site https://www.lammertbies.nl/comm/info...lculation.html donne : 0x0A8B2101
    j'en conclu que soit votre exemple est erroné soit le code C ne correspond pas à votre crc
    Il est d'ailleurs équivalent à la fonction sCalculeCrc32 de WinDev. En terme de performance, c'est sans surprise que la fonction native est plus performante, de l'ordre de 10 fois sur 1.000.000 de calculs du même CRC.

    Le sujet est donc pour ma part Résolu ! ce fut un superbe exercice , rien de plus au final puisque je ne me servirai pas de ce code mais bel et bien de la fonction intégrée

    Code WINDEV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    PROCEDURE CalculeCRC32(tab_Data est un tableau de chaînes)
     
    tab_CRC_Obtenu est un tableau de chaînes
     
    n_A est un entier sur 4 octets sans signe
    n_B est un entier sur 4 octets sans signe
    n_C est un entier sur 4 octets sans signe
    n_D est un entier sur 4 octets sans signe
    n_CRC est un entier sur  4 octets sans signe
     
    crc32_tab est un tableau d'entiers sur  4 octets sans signe
     
    crc32_tab = [...
    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,...
    0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,...
    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,...
    0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,...
    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,...
    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,...
    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,...
    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,...
    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,...
    0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,...
    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,...
    0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,...
    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,...
    0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,...
    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,...
    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,...
    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,...
    0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,...
    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,...
    0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,...
    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,...
    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,...
    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,...
    0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,...
    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,...
    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,...
    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,...
    0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,...
    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,...
    0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,...
    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,...
    0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,...
    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,...
    0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,...
    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,...
    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,...
    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,...
    0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,...
    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,...
    0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,...
    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,...
    0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,...
    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d...
    ]
     
    //crc = crc ^ ~0U;
    n_CRC = OUExclusifBinaire(n_CRC, NONBinaire(0x00000000))
     
    //while (size--) <= On part de la fin du buffer pour aller au début
    //POUR n_Indice = tab_Data..occurrence _a_ 1 pas -1
    POUR n_Indice = 1 _A_ tab_Data..Occurrence
     
    	// On va décomposer les étapes trouvées dans le code en C pour plus de clarté
     
    	// A = crc ^ *p++
    	//	n_A = OUExclusifBinaire(n_CRC, Val(tab_Data[n_Indice],"x"))
    	n_A = n_CRC || Val(tab_Data[n_Indice],"x")
     
    	// B = A  & 0xFF
    	//	n_B = ETBinaire(n_A, 0xFF)
    	n_B = n_A & 0xFF
     
    	// C = crc32_tab[B]
    	n_C = crc32_tab[n_B + 1]	//=> +1 parceque quand tu traduis du C en WinDev, tu commences les tableaux à 1
     
    	// D = crc >> 8
    	//	n_d = n_CRC bitDécaleDroite(8)
    	n_D = n_CRC bitDécaleDroite 8
     
    	// CRC = C ^ D
    	//	n_CRC = OUExclusifBinaire(n_C, n_D)
    	n_CRC = n_C || n_D
     
    FIN
     
    //return crc ^ ~0U
    n_CRC = OUExclusifBinaire(n_CRC, NONBinaire(0x00000000))
     
    ChaîneVersTableau(EntierVersHexa(n_CRC, 2),tab_CRC_Obtenu," ")
     
    RENVOYER tab_CRC_Obtenu

  14. #14
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Youpie ! +1 er merci pour le retour !
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul d'une moyenne depuis un fichier
    Par koffitheo dans le forum C
    Réponses: 3
    Dernier message: 13/08/2013, 10h04
  2. [Toutes versions] Calcul cube OLAP SSAS depuis Excel
    Par lcolombain dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 26/03/2012, 09h27
  3. Calcul de date future depuis date de depart + fréquence
    Par Math8857 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/08/2011, 15h21
  4. Calculer un champ texte depuis un autre champ texte via Onchange
    Par tomguiss dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/10/2010, 18h58
  5. Aide pour un script qui calcule le temps passé depuis une date
    Par Mooneer dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/05/2008, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo