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!):

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)
Question: Comment le convertir en C#?
Mon problème vient de du 'typage' des variables...

Je n'arrive meme pas a traduire le fonction 'crc16':
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;
}
Toute aide/proposition est la bienvenue!

Merci d'avance.