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 .
Partager