Bonjour ç tous et à toutes ,



Un Modérateur m'as conseillé un code écrit en JAVA et je souhaite le traduire en C tout simplement :

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
 
// the precomputed values for all possible byte values
private static long[] CRC64Table = new long[256];
 
// precompute the CRC-64 table for one byte
static {
	// x64 + x4 + x3 + x1 + 1
	long POLY64        = 0x000000000000001BL;
	long POLY64Reverse = 0xd800000000000000L;
 
	long reminder;
	for(int i=0;i<256;i++) {
		reminder = i;
	    for (int j=0;j<8;j++) {
	    	if ((reminder & 1) !=0)
	    		reminder = (reminder >>> 1) ^ POLY64Reverse;
	    	else
	    		reminder = reminder >>> 1;
	    }
	    CRC64Table[i] = reminder;		
	}
}
 
public static long crc64_fast(char[] sequence) {
	long crc = 0;
	for(int i=0;i<sequence.length;i++) {
		int index = (int) ((crc ^ sequence[i]) & 0xff);
		crc = CRC64Table[index] ^ (crc >>> 8);
	}
	return crc;
}
 
public static void main(String[] args) {
	long crc = 0;
	String s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
 
	crc = crc64_fast(s.toCharArray());
	System.out.println(Long.toHexString(crc));
}
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
27
28
29
30
31
32
 
 
 
public static long crc64_slow(char[] sequence) {
	// x64 + x4 + x3 + x1 + 1
	long POLY64 = 0x000000000000001BL;
	long POLY64Reverse = 0xd800000000000000L;
 
	long reminder = 0;
	for(int i=0;i<sequence.length;i++) {
 
		reminder = reminder ^ sequence[i];
 
		for (int bit=7;bit>=0;bit--) {
			if ( (reminder & 0x1)==1) {
				reminder = (reminder >>> 1)^ POLY64Reverse;
			} else {
				reminder = (reminder >>> 1);
			}
		}
	}
	return reminder;
}
 
public static void main(String[] args) {
	long crc = 0;
	String s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
 
	crc = crc64_slow(s.toCharArray());
	System.out.println(Long.toHexString(crc));
 
}




Voici ma traduction :

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
27
28
29
30
 
 
 
unsigned long long calc_crc64(char [] ,  unsigned long sequence)
{
    //long POLY64Reverse = 0xd800000000000000L;
 
  unsigned long reminder =0;
  int i, bit;
 
  for( i=0 ;i<sequence; i++)
 
  reminder = reminder ^ sequence ++;
 
 
		for (bit=8; i>=0; i--)
		{
			if ( (reminder & 0x1)==1) 
			{
				reminder = (reminder >> 1)^ POLY64Reverse;
 
			}
			else
			{
				reminder = (reminder >> 1);
			}
 
	return reminder;
 
       }
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
 
 
 
              #ifndef _CRC64_H_
             #define _CRC64_H_
 
    #define POLY64 0x000000000000001BL;
    #define POLY64Reverse 0xd800000000000000L;
 
 
 
 
unsigned long long Update_CRC64(unsigned long long crc, unsigned char *buf, unsigned long len);
unsigned long long calc_crc64(char [] ,  unsigned long sequence);
 
 
#endif /* _CRC64_H_ */



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
27
28
29
30
31
32
33
34
35
 
 
 
 
unsigned long long  Hash64_End(unsigned long long hash, unsigned char *sequence)
{
 
    unsigned  long reminder;
    int i, j;
 
{
		reminder = i;
	    for ( j=0;j<8;j++)
	    {
	    	if ((reminder & 1) !=0)
 
	    	do
	    	{
 
	    		reminder = (reminder >> 1) ^ POLY64Reverse;
 
	    		reminder = (reminder >> 1);
	    	}
 
	    CRC64Table[i] = reminder;
 
 
     }
 
}
 
 
return reminder ;
 
}


Si y'a des gens qui pourront me corriger si j'ai fait des ERREURS de traduction de Java en C .


Cordialement ,
Fred .