begin process at 2012 05 30 10:12:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Traduction d'une fonction C en math


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

Traduction d'une fonction C en math

jeudi 10 août 2006 à 12:33:01 | Traduction d'une fonction C en math

nitrique

Bonjour à tous,

J'ai besoin de comprendre le calcul fait par cette fonction (issue d'une doc) afin de le faire à la main.
N'étant pas une élite des symboles C, je demande votre aide afin de transcrire ça en math.

This 'C' code segment and data table illustrates how the CRC is calculated.

typedef unsigned int WORD;
typedef unsigned char BYTE;
typedef union{
WORD w;
struct{
BYTE lo, hi;
} b;
} BYTEWORD;
WORD ComputeCRC16(char *msg, int len){
BYTEWORD chksum;
unsigned char *msgchk;
chksum.w = 0xFFFF;
msgchk = (unsigned char *) msg;
while (len--){
chksum.w = chksum.b.hi ^ (ccittrev_tbl[chksum.b.lo ^ *msgchk++]);
}
chksum.w = ~chksum.w;
return(chksum.w);
}

Le CRC est sur 2 bits...
Pour des éventuels tests, voici quelques exemples en hexa:
01 02 00, doit retourner: 9F DE
08 02 01 4F 00, doit retourner: 76 5E
08 02 01 23 00, doit retourner: 76 73
07 02 00, doit retourner: 9E 3E
05 02 00, doit retourner: 5E 9F

Merci d'avance.
[ Lien ]
jeudi 10 août 2006 à 12:40:05 | Re : Traduction d'une fonction C en math

nitrique

Heu....
Ce tableau va peu-être vous être utile:

static const WORD ccittrev_tbl[] = {
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
};

David, à VERSAILLES
[ Lien ]
vendredi 11 août 2006 à 09:15:00 | Re : Traduction d'une fonction C en math

nitrique

Réponse acceptée !

C'est bon, j'ai trouvé:

Indice = byte_de_poid_faible_de_mot XOR nième_caractère_de la_chaine
mot = byte_de_poid_fort_de_mot XOR ccittrev_tbl[indice] // mot vaut 0xFFFF pour le premier caractère
Une fois que l'on a parcouru toute la chaine, on inverse les bites du mot obtenu (opérateur NOT).


Exemple pour: 01 02 00

// Premier element
mot = FFFF
ind = FF XOR 01 // = FE = 254
mot = FF XOR [ind] // = FF XOR 0x8081 = 807E

// Deuxième element
mot = 807E
ind = 7E XOR 02 // = 7C = 124
mot = 80 XOR [ind] // = 80 XOR 0xE101 = E181

// Troisième element
mot = E181
ind = 81 XOR 00 // = 81 = 129
mot = E1 XOR [ind] // = 22 XOR 0x60C0 = 6021

NOT 6021 = FFFFFFFFFFFF9FDE, donc 9FDE sur 2 bits.

FASTOCHE !!!
[ Lien ]



Cette discussion est classée dans : fonction, char, retourner, unsigned, chksum


Répondre à ce message

Sujets en rapport avec ce message

pb avec variable [ par jeffise57 ] Please aidez moiJe reçoit comme arugument du fonction des variables unsigned char* et je doit passer dans une deuxième fonction les même arguments mai Pointeurs et Desallocation [ par gilimcce ] Bonjour à tous....je declare une fonctionloadJpegImage(char *, unsigned char*, int*, int*)1e parametre : le chemin de l'image chargee2e // pointeur à la fin "\0" [ par avg ] j'ai une fonction qui demande un pointeur sur unsigned char mais il faut qu'il contient à la fin "\0" comment je peut faire [code=cpp] unsigned char Fonction _T(); [ par d4M13N ] Bonjour,Je suis en train de faire un petit programme en C++ Application Windows Form sous Microsoft Visual Studio 2005.Je suis bloqué sur une malheure conversion double en char* [ par snakers07 ] bonjour, voici mon probleme void grilleSetText(ligne,colonne,char*Text;) est une fonction comme ont peut le voir qui pren en parametre char*or j'ai un


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 : 0,203 sec (3)

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