Accueil > Forum > > > > Problème de traduction d'un Checksum Perl en langage C++
Problème de traduction d'un Checksum Perl en langage C++
mardi 29 juin 2010 à 11:54:28 |
Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
Bonjour a tous :)
Je suis nouveau sur le site et je viens a votre rencontre car je suis sur un code qui me pose problème depuis quelque jour déjà.
Alors voila mon tuteur de stage m'a demandé de transcrire un code en Perl en C++
Il s'agit d'un code allant chercher des informations sur un capteur et a les sortir après calcul dans une console.
En ce moment je bloque sur la fonction qui permet de calculer un CRC16.
Voici le code en Perl :
#!/usr/bin/perl -w
sub checksum16 ($) {
# calculates the checksum 16 of the given string argument
my @bytes = unpack("C*", $_[0]);
my $sum = 0;
foreach(@bytes) {
$sum += $_;
$sum %= 2**16;
}
return $sum;
}
J'ai essayé plusieurs choses mais même après plusieurs je n'arrive pas a avoir quelques chose de concret.
Cela fait 3 jours que je parcours le net a la recherche d'un tuto ou d'un prototype pour le faire mais je n'arrive pas a faire la correspondance.
Je vous montre une ébauche de ma transcription en C++ :
Code C/C++ :
#include <stdio.h>
#include <math.h>
typedef unsigned int CRC;
CRC crc_16(unsigned char c);
CRC crc_16(unsigned char c)
{
int i,j,k;
for(i=0;i!=8;c>>=1,i++)
{
j = CRC+CRC;
k = pow(2,16);
j = CRC%k;
CRC = j;
}
return CRC;
}
Voila si quelqu'un peut me donner quelques infos pour que je puisse avancer un peu cela m'aiderait beaucoup :)
Merci d'avance.
Avoir le refrain beau a rechercher des crosses....serait prendre a revers la haine a écoper...
|
|
mardi 29 juin 2010 à 14:24:46 |
Re : Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
J'ai oublié de préciser que mon code en C++ me retourne toujours 0... :p
Avoir le refrain beau a rechercher des crosses....serait prendre a rever la haine a écoper...
|
|
mardi 29 juin 2010 à 16:38:59 |
Re : Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
Petit Up car j'avance un peu mais ce n'est pas encore ca :p
J'ai un problème de concordance entre les 2 codes:
Quand j'exécute le code Perl, j'obtiens 116
Code :
#!/usr/bin/perl -w
sub checksum16 ($) {
# calculates the checksum 16 of the given string argument
my @bytes = unpack("C*", $_[0]);
my $sum = 0;
foreach(@bytes) {
$sum += $_;
$sum %= 2**16;
}
return $sum;
}
print checksum16 ("t");
print "\n";
et quand j'execute le code C++ avec le même parametre j'obtiens 4294967268
Code C/C++ :
#include <stdio.h>
#include <math.h>
#include <string.h>
typedef const char CRC;
CRC crc_16(unsigned char c)
{
int i,j,k = 0;
for(i=0;i!=8;c>>=1,i++)
{
k += c;
k %= 1<<16;
}
return k;
}
int main()
{
printf("%u",crc_16('t'));
printf ("\n");
return 0;
}
Voila :p
Si quelqu'un sait ce qui ne va pas, qu'il n'hésite pas je suis ouvert a toute critique:p
Cordialement,
Dredd
Avoir le refrain beau a rechercher des crosses....serait prendre a rever la haine a écoper...
|
|
mardi 29 juin 2010 à 17:30:42 |
Re : Problème de traduction d'un Checksum Perl en langage C++

CptPingu
|
Si on reprend ton exemple en Perl (je met "toto" au lieu de "t"):
Code :
#!/usr/bin/perl -w
sub checksum16 ($) {
# calculates the checksum 16
# of the given string argument
my @bytes = unpack("C*", $_[0]);
my $sum = 0;
foreach(@bytes) {
$sum += $_;
$sum %= 2**16;
}
return $sum;
}
print checksum16 ("toto");
print "\n";
On observe que l'utilisateur donne une chaîne de caractère et non un seul et unique caractère. Chacun des éléments est alors accumulé dans sum, puis un modulo de 2**16 est fait.
En C:
2**16 => 2 << 15 (et pas 16, fait le décalage sur un papier, tu verras :p)
Une chaine de caractère, c'est char*.
Au final, on peut faire:
Code C/C++ :
#include <stdio.h>
unsigned int crc_16(char* s)
{
unsigned int sum = 0;
while (s && *s)
{
sum += *s;
sum %= 2 << 15;
++s;
}
return sum;
}
int main(void)
{
printf("%u\n", crc_16("toto"));
return 0;
}
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
mardi 29 juin 2010 à 17:38:32 |
Re : Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
J'ai enfin réussi :)
Mon problème venait du fait que je ne prenais pas en compte la longueur du caractère.
Code C/C++ :
#include <cstdlib>
#include <cstdio>
#include <string>
typedef const char CRC;
CRC crc_16( char c)
{
int i,j,k = 0;
for(i=0;i<sizeof(c);i++)
{
k += c;
k %= 2<<16;
c>>=1;
}
return k;
}
int main()
{
printf("%d",crc_16('t'));
printf ("\n");
return 0;
}
Avoir le refrain beau a rechercher des crosses....serait prendre a rever la haine a écoper...
|
|
mardi 29 juin 2010 à 17:44:01 |
Re : Problème de traduction d'un Checksum Perl en langage C++

CptPingu
|
Voir mon commentaire :)
Ton code n'a pas besoin de la boucle, puisque sizeof (c) == 1. Donc il n'y a jamais accumulation. Ce qui équivaudrait à faire: printf("%d",crc_16('t')); => printf("%d", 't');
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
mardi 29 juin 2010 à 17:45:40 |
Re : Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
Edit : cela ne marche qui si on met 1 caractère xD
j'ai testé ton code, il marche parfaitement, je me chope un warning mais cela marche quand même :p
Merci beaucoup en tout cas:)
Je retourne a la suite de mon code en Perl:p
Je repasserais surement par ici d'ici peu xD
Cordialement,
Dredd
Avoir le refrain beau a rechercher des crosses....serait prendre a rever la haine a écoper...
|
|
mardi 29 juin 2010 à 17:47:17 |
Re : Problème de traduction d'un Checksum Perl en langage C++

CptPingu
|
Ça m'étonne, j'ai compilé en "-ansi -pedantic" (le mode le plus strict). Quel est le warning ?
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
mardi 29 juin 2010 à 17:52:54 |
Re : Problème de traduction d'un Checksum Perl en langage C++

dreddfullmetal
|
je me chope ca :
romain@romain-laptop:~/Documents/Traduction Perl -> C++$ g++ -o test test_sum2.cpp
test_sum2.cpp: In function ‘int main()’:
test_sum2.cpp:18: warning: deprecated conversion from string constant to ‘char*’
Avoir le refrain beau a rechercher des crosses....serait prendre a rever la haine a écoper...
|
|
mardi 29 juin 2010 à 17:59:26 |
Re : Problème de traduction d'un Checksum Perl en langage C++

CptPingu
|
A ba oui évidemment !
Tu compiles en C++, alors que c'est codé en C !!!
2 solutions:
- Tu le fais en C, et tu compiles avec:
gcc -W -Wall -ansi -pedantic test_sum2.c -o test
- Tu le fais en C++, et tu compiles avec:
g++ -W -Wall -Wabi -pedantic test_sum2.cpp -o test
Avec:
Code C/C++ :
#include <iostream>
unsigned int crc_16(const std::string& s)
{
unsigned int sum = 0;
const unsigned int size = s.size();
for (unsigned int i = 0; i < size; ++i)
{
sum += s[i];
sum %= 2 << 15;
}
return sum;
}
int main()
{
std::cout << crc_16("toto") << std::endl;
return 0;
}
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
Cette discussion est classée dans : problème, code, crc, sum, perl
Répondre à ce message
Sujets en rapport avec ce message
(MS VCpp) Problème de variables [ par YS1 ]
J'ai créé une DLL C+PP que je souhaite utiliser dans un programe VB.La fonction principale de la DLL renvoie un certain nombre de variables, qui sont
problème chaines de caractères [ par tintin72 ]
BonjourJ'aimerai avoir un petit éclaircissement sur les chaines de caractères.Voici un programme tout bête... char prenom[100]; cout gets(pr
Petit problème de code [ par mimyne ]
Bonjour g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[10]; if (pSender == Btnres) { //o
Problème de code en c++ (fonction itoa) [ par mimyne ]
voila g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[2]; if (pSender == Btnres) { { ito
If problème [ par Hades53 ]
J'ai un problème avec If :char*variable1;variable1 = "bonjour";if (variable1 == "bonjour") cout <
Problème incompréhensible [ par CyberP ]
Dans un callback d'une fenêtre, j'ai inséré ce code :case WM_PAINT:{ PAINTSTRUCT peindre; HDC rect; rect = BeginPaint(hWnd, &peindre); Engine.dr
Un porblème : Oui un très gros ! [ par PiX3L ]
Salut tt le monde,bon c'est super le C++ surtout quand y a pas de bug !Mais le problème c'est que j'en ai et que ça fais 2 heures que je suis dessus e
Problème : Récupération des données d'un Buffer pour mettre dans une EditBox [ par Memerosti ]
BonjourMon problème est le suivant : J'ai ouvert un fichier, lu ses données, et jusque là ça va. Mais ensuite je voudrais récupérer ces données, pour
[C++][MFC] Problème avec les onglets [ par impress ]
Bonjour, Après avoir parcouru différents forums et tutoriaux, j'ai réussi (enfin !) à créer des onglets de façon propre.Le problème, c'est que je n'ar
pb stupide : diviser [ par guifr ]
Alors là, je sens que je vais craquer, je suis à deux doigts de commettre un ordicide ! sois mon pc est complètement stupide, ou alors c'est moi (ce q
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|