begin process at 2012 05 29 22:38:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Problème de traduction d'un Checksum Perl en langage C++


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS

je me chope un warning


Ç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 &#8216;int main()&#8217;:
test_sum2.cpp:18: warning: deprecated conversion from string constant to &#8216;char*&#8217;


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

Administrateur CodeS-SourceS
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

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,502 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales