Bonjour,
je cherche des sources pour recuperer le crc d'un fichier (16 bits) par exemple afin de prouver l'unicité d'un fichier.
merci de votre aide
Bonjour,
je cherche des sources pour recuperer le crc d'un fichier (16 bits) par exemple afin de prouver l'unicité d'un fichier.
merci de votre aide
Peut-etre connaissez vous une api particulière a utiliser...
j'ai trouvé ça, c'est en C#mais ça doit pas être dur à traduire
http://www.codeproject.com/csharp/cs...kAlgorithm.asp
http://www.codeproject.com/csharp/marcelcrcencoding.asp
http://www.codeproject.com/cs/files/crcstream.asp
Sinon, google m'a donné ça, tu devrais éssayer google parfois ...
http://www.vbaccelerator.com/home/NE...32/article.asp
Moi j'ai utilisé ça, c'est le même algorithme que la commande sum sous linux :
Pareil il te suffira de convertir en VB.NET
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 public static int GetCheckSum(string filename, out int fileSize) { byte[] buffer = File.ReadAllBytes(filename); int size = buffer.Length; fileSize = size; Int32 cksum = 0; int counter = 0; while (size > 0) { UInt16 val = buffer[counter]; cksum += Convert.ToInt32(buffer[counter]); counter += 1; size -= 1; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); return cksum; }
Ce serai peut être mieux d'avoir un buffer limité par exemple à 2048 bytes et lire au fur et à mesure, parce que si par érreur tu rentres dedans un fichier de 800 Mo, tu sera embetté non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 byte[] buffer = File.ReadAllBytes(filename);
Je fournis le code en l'état, il est adapté à mes spécifiquement à mes besoins. Je ne garantis pas qu'il fonctionnera bien pour toutes les utilisations.Envoyé par smyley
Il convient effectivement de prendre en compte ce genre de considérations en fonction des cas.
Cette méthode est utilisée dans un traitement automatique, donc je n'ai pas intégré de gestion bloc par bloc.
Bonjour,
Voici la version que j'utilise en VB (fortement inspirée d'un code existant déjà sur le net).
Elle est plus longue et peut être optimisable mais c'est en partie du à ce que chaque ligne est commentée pour comprendre comment ça 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 Public Function CRC32Calculation(ByVal pFileName As String) As Long 'BUT : Calcule la CRC du fichier en paramètre 'RETOUR : la valeur de la CRC Dim Crc32Table(255) As Long 'Tableau permettant de calculer le CRC d'un fichier Dim lTableValue As Long Dim iCounter As Long Dim bCharValue As Byte Dim lAccValue As Long Dim lIndex As Long Dim lCrc32Value As Long Dim lTempCrc32 As Long Dim iBytes As Integer Dim iBits As Integer Dim lCrc32 As Long Dim FileData() As Byte Dim FileSize As Long Dim BinReader As BinaryReader Try If Not FileExists(pFileName) Then Return 0 End If BinReader = New BinaryReader(File.Open(pFileName, FileMode.Open)) FileSize = SizeOfFile(pFileName) FileData = BinReader.ReadBytes(FileSize) 'Initialise le tableau du CRC et ajuste le CRC par XOR For iBytes = 0 To 255 'CRC temporaire = compteur de cycle lCrc32 = iBytes 'Effectue un decalage de bit vers la droite For iBits = 0 To 7 'Masque le bit de WeightList faible lTempCrc32 = lCrc32 And &HFFFFFFFE 'Decale les bits vers la droite lTempCrc32 = lTempCrc32 \ &H2 'Masque le bit de WeightList fort lTempCrc32 = lTempCrc32 And &H7FFFFFFF 'Verifie si le CRC = 0 et mix avec la valeur Seed If (lCrc32 And &H1) <> 0 Then lCrc32 = lTempCrc32 Xor &HEDB88320 Else lCrc32 = lTempCrc32 End If Next 'Add le CRC dans la table Crc32Table(iBytes) = lCrc32 Next 'On va verifier toute les données du fichier, donc Loop de 0 à [Fin du fichier] For iCounter = 0 To UBound(FileData) 'Var temporaire = donnée du fichier à la position icounter bCharValue = FileData(iCounter) 'Masque les bits 0 à 255 (WeightList faible) lAccValue = lCrc32Value And &HFFFFFF00 'Divise par 256 (decalage vers la droite) lAccValue = lAccValue \ &H100 'Masque les bits de WeightList fort lAccValue = lAccValue And &HFFFFFF 'Recupere le module de 256 lIndex = lCrc32Value And &HFF 'XOR avec la variable temporaire lIndex = lIndex Xor bCharValue 'Recupere le CRC dans notre table selon l'index donné par le calcul lTableValue = Crc32Table(lIndex) 'Puis on combine avec notre valeur lCrc32Value = lAccValue Xor lTableValue Next BinReader.Close() 'Renvoie le CRC Return lCrc32Value Catch ex As Exception 'Un p'tit message si besoin est... Return 0 End Try End Function
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager