Bonjour a tous,
Je suis charger de faire du reverse engineering sur le logiciel de contrôle d'antennes satellites, car il tourne sous win98...
Je communique sur un port série, qui utilise un mécanisme de contrôle 'CRC 16 - CCITT'.
En sniffant la liaison, je trouve cette trame: 01 00 9f 16
Donc quand j'envoie '01 00', le CRC correspondant est '9f 16'
Malheureusement, code c# que j'ai trouvé sur le net ne me renvoie pas le fameux '9f 16'... Mais me renvoie la meme chose que http://www.lammertbies.nl/comm/info/...lculation.html
Du coup j'en deduis que mon programme a re coder fait quelque chose de ... différent!
Heureusement, j'ai ce petit script python qui fait exactement le travail (et je suis sur qu'il marche!):
Question: Comment le convertir en C#?
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
22
23
24
25
26 #Function to calculate CRC16 def crc16( crc, data): crc ^=(~(~0<<16)) for J in range(8): if (data&(1<<J)): crc^=1 if (crc &1): crc=(crc>>1)^(((1<<15)>>12)|((1<<15)>>5)|((1<<15)>>0)) else: crc=(crc>>1) crc^=(~(~0<<16)) return (crc) ##TREATMENT ON GRS RC NewFrame = [0x01, 0x00] #CRC calculated_CRC=0 for x in range(len(NewFrame)): calculated_CRC=crc16(calculated_CRC,NewFrame[x]) calculated_CRC=(((calculated_CRC<<8)&0xFF00)|(0x00FF&(calculated_CRC>>8))) print(calculated_CRC)
Mon problème vient de du 'typage' des variables...
Je n'arrive meme pas a traduire le fonction 'crc16':
Toute aide/proposition est la bienvenue!
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 public ushort crc16(ushort crc, byte data) { crc ^= (~(~0 << 16)); for(int J = 0; J < 8; ++J) { if ( (data & (0x01 << J)) == 1) { crc^=1; } if ( (crc & 1) == 1) { crc = (crc >> 1) ^ (((1 << 15) >> 12) | ((1 << 15) >> 5) | ((1 << 15) >> 0)); } else { crc = (ushort)(crc >> 1); } } crc^=(~(~0<<16)); return crc; }
Merci d'avance.
Partager