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

 C Discussion :

Valeurs hexadécimales sur 8 octets pour CRC64


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut Valeurs hexadécimales sur 8 octets pour CRC64
    Hello,

    J'ai un petit challenge à compléter.
    Pour cela je dois utiliser la fonction CRC64 donnée ci-dessous en php

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function crc64($string)
    {
        $poly = (0xC96C5795 << 32) | 0xD7870F42;
        $crc = 0;
        for($i=0;$i<strlen($string);$i++)
        {
            $byte = ord($string[$i]);
            for($bit=0;$bit<8;$bit++,$byte>>=1)
            {
                $crc = (($crc>>1)& ~(1<<63)) ^ ((($crc^$byte)&1)?$poly:0);
            }
        }
        return $crc;
    }

    Que j'ai réecrit en C ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned long long int crc64( char* s )
    {
        unsigned long long int poly = (0xC96C5795ULL << 32) | 0xD7870F42;
        unsigned long long int crc  = 0x0;
        for ( size_t i=0 ; i< strlen(s) ; i++ )
        {
            unsigned long long int byte = s[i];
            for ( size_t bit=0 ; bit<8 ; bit++, byte>>=1 )
                crc = (( crc>>1 )&~(1ULL<<63)) ^ ((( crc^byte )&1 )?poly:0 );
        }
        return crc;
    }
    Le soucis est que je devrais récupérer un CRC de 8 octets or la fonction renvoie un CRC de 4 octets.
    Je n'arrive pas à déterminer l'origine de ce problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
           printf("\nNumber of bits for unsigned long long int type : %u", 8*sizeof(unsigned long long int));
        printf("\n CRC = %x", crc64("t" ));
        return 0;
     }
    Me retourne CRC = 0xe7197349
    Mais il en manque la moitié sauf mauvaise compréhension de ma part.

    Merci d'avance.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Si c'est du long long, alors as-tu essayé %llx et non %x ?
    Aussi, le paramètre devrait être un const char* et strlen devrait être sorti de la boucle, sinon il sera exécuté à chaque boucle.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut
    Ahhhhhhhh effectivement 😂 it works better ! Merci je n ai pas pensé au format en effet.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  4. #4
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut
    La fonction CRC64 me retourne
    - en PHP : 0x181c307118953949
    - en C : 0x46c4478f73cd3b20

    Une idée d'où se trouve la perte ?


    Code : 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
     
    unsigned long long int crc64( const char* s )
    {
        unsigned long long int poly = 0xc96c5795d7870f42ULL; //(0xC96C5795ULL << 32) | 0xD7870F42ULL;
        unsigned long long int crc  = 0;
     
        size_t s_sz = strlen(s);
        for ( size_t i=0 ; i<s_sz ; i++ )
        {
            unsigned long long int byte = s[i];
            for ( size_t bit=0 ; bit<8 ; bit++, byte>>=1 )
                crc = ((crc>>1) & 0x7fffffffffffffffULL) ^ ( ((crc^byte)&1)?poly:0 );
        }
        return crc;
    }
     
    int main()
    {
        printf("\n0x%016llx", crc64("161a653b38"));
        return 0;
    }
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function crc64($string)
    {
        $poly = (0xC96C5795 << 32) | 0xD7870F42;
        $crc = 0;
        for($i=0;$i<strlen($string);$i++)
        {
            $byte = ord($string[$i]);
            for($bit=0;$bit<8;$bit++,$byte>>=1)
            {
                $crc = (($crc>>1)& ~(1<<63)) ^ ((($crc^$byte)&1)?$poly:0);
            }
        }
        return $crc;
    }
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Pour moi la ligne suspecte est unsigned long long int byte = s[i];.
    La conversion de char en long long n'a peut-être pas le même effet que la fonction ord de php.
    Utilise le debugger ou quelques print dans chaque script pour voir où ça diverge.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut
    Hello,

    Merci pour ton retour.
    La fonction Ord est supposé retourner le code ASCII du caractère.
    Le valeur retournée par le cast de char vers unsigned long long renvoi bien le code ASCII correspondant au caractère "casté".
    J'ai voulu vérifier le code PHP ce weekend avec WAMP mais infoutu de faire fonctionner le server WEB
    Il faut effectivement que je vérifie ce point précisément avec l'execution du code PHP.
    Néanmoins https://www.geeksforgeeks.org/php-ord-function/ semble confirmer ce point.

    Ca me semble OK ( fonction C ) et correspond avec ce que j'ai pu lire de ord sur le site nommé ci dessus.
    http://www.asciitable.com/
    crc64("161a653b38") - Affichage issue de printf directement exécute dans la bouche de la fonction crc64.
    ASCII Code for 1 is 49
    ASCII Code for 6 is 54
    ASCII Code for 1 is 49
    ASCII Code for a is 97
    ASCII Code for 6 is 54
    ASCII Code for 5 is 53
    ASCII Code for 3 is 51
    ASCII Code for b is 98
    ASCII Code for 3 is 51
    ASCII Code for 8 is 56
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  7. #7
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut
    Code php : 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
    <?php
     
    function crc64($string)
    {
        $poly = (0xC96C5795 << 32) | 0xD7870F42;
        $crc = 0;
        for($i=0;$i<strlen($string);$i++)
        {
            $byte = ord($string[$i]);
            for($bit=0;$bit<8;$bit++,$byte>>=1)
            {
                $crc = (($crc>>1)& ~(1<<63)) ^ ((($crc^$byte)&1)?$poly:0);
            }
        }
        return $crc;
    }
     
    $string = "161a653b38";
    $crc = crc64($string);
    echo dechex($crc);
     
    ?>

    résultat : 0x46c4478f73cd3b20

    Si c'est pas une blague ^^
    Pourtant dans l'énoncé, l'auteur indique bien que ce n'est pas cette valeur et d'autres ont pu le confirmer.
    Je pige pas !
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

Discussions similaires

  1. [XL-2003] Récupérer une valeur calculée sur un sheet pour le renvoyer dans une listbox
    Par Thierry2B dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/01/2011, 09h55
  2. ecrire valeur int sur 3 octets
    Par Septembre84 dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2008, 14h11
  3. Valeur négative en binaire sur 2 octets
    Par declencher dans le forum Delphi
    Réponses: 7
    Dernier message: 03/05/2007, 14h01
  4. récupération d'une valeur sur deux octets
    Par sanatou dans le forum C++
    Réponses: 6
    Dernier message: 09/01/2007, 16h35
  5. Boucler sur une table pour renommer des valeurs
    Par webwhisky dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/01/2006, 14h19

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