Optimisation de code ReadByte et WriteByte vb [Résolu]

Signaler
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
-
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
-
Bonjour,

Je développe un petit bout de code qui permet de lire un ficher byte par byte puis de l’écrire dans un nouveau fichier créé préalablement.
Je voulais savoir si je pouvais optimiser ce code pour que le traitement soit plus rapide, en effet il faut bien 5 minutes au-delà de 20Mo de fichier.

Voici mon bout de code:

Using file As New IO.FileStream(SrcFile, IO.FileMode.Open)
Using fileCrpt As New IO.FileStream(cryptName, IO.FileMode.Open)
For i As Integer = 0 To dataArray.Length - 1
dataArray(i) = file.ReadByte()
HexResult = dataArray(i).ToString("X2")
cryptHex = crypt(HexResult)
fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex)))
EndOfCryptBar.Value = i
Next i

End Using
End Using


Comme vous l'avez vu il y a une conversion mais cela n'affecte pas la durée, j'ai essayé sans c'est pareil.
Voilà j’espère que vous pourrez m'aider à optimiser ce code (si c'est possible)

Ce qui me prend beaucoup de ressources c'est le tableau dataArray qui prend la même taille que le fichier source j'ai essayé de la purger au fur et à mesure mais je n'y arrive pas, je mets juste la valeur du tableau en empty.
( dataArray(i - 1) = vbEmpty )

Merci d'avance !

A voir également:

2 réponses

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
156
Ce que tu peux faire déjà c'est au lieu de faire une lecture/écriture octet/octet c'est déjà de prendre plusieurs octets d'un coup.

Ensuite, dimensionne ton tableau à la taille de ta lecture, effectue le chiffrement sur le tableau puis écrit le contenu du tableau.

Regardes les méthodes Write et Read des flux binaires.
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016

Ok j'ai gagner un peu de vitesse, c'était a cause de mon comptage I.

J'ai fait autrement c'est beaucoup plus rapide, mais je sens que ce n'est pas encore la meilleur façon de faire !

Je fais par paquet de 4096 bytes de tableau

Do Until file.Position >= file.Length
If FilesrcLen < 4095 Then
DataLeng = FilesrcLen - 1
Else
DataLeng = "4095"
FilesrcLen = FilesrcLen - 4096
End If
Dim dataArray(DataLeng) As Byte
For i As Integer = 0 To dataArray.Length - 1
dataArray(i) = file.ReadByte()
HexResult = dataArray(i).ToString("X2")
cryptHex = crypt(HexResult)
fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex)))
'vCount = vCount + 1
Next i
EndOfCryptBar.Value = file.Position
Loop




Membre
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016

Okey voilà ou j'en suis aujourd'hui:

                    Dim n As Integer = -1
Dim X As Integer = Fix(file.Length / 4096)
Dim nbOctetL = file.Length Mod 4096
If nbOctetL > 0 Then
n = X
X = X + 1
End If
DataLeng = 4096
For a As Integer = 0 To X - 1
If a = n Then
DataLeng = nbOctetL
End If
Dim dataArray(DataLeng) As Byte
file.Read(dataArray, 0, DataLeng)
For i As Integer = 0 To DataLeng
dataArray(i) = CByte(Conversion.Val("&H" & Crypt(dataArray(i).ToString("X2"))))
Next i
fileCrpt.Write(dataArray, 0, DataLeng)
Application.DoEvents()
Next a


Le fait de crypter byte par byte de mon tableau me ralenti énormément c'est vrai..

Demain je vais essayer de trouver une technique pour le faire d'un coup avec le tableau des 4096 octet
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137 >
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016

bonjour
Remplace cette ligne
dataArray(i) = CByte(Conversion.Val("&H" & Crypt(dataArray(i).ToString("X2"))))

par
dataArray(i) = Convert.ToByte(Crypt(dataArray(i).ToString("X2")),16)


De plus sans voir le code du cryptage impossible de voir comment l'optimiser au mieux
>
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021

Je préfère que mon cryptage reste "anonyme" le plus longtemps possible.
Mais tu peux comparer ce traitement a un string reverse avec des paramètres.

Pour te donnée une idée du temps que sa prend tu peux faire un
dataArray(i) = Convert.ToByte(StrReverse(dataArray(i).ToString("X2")),16)


J'ai comparé avec mon code sur un fichier de 300Mo il y a une seconde d’écart en temps de traitement.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137 > jboss38
OK pas de soucis je comprends !
Mais ce que je voulais dire c'est que tu prends un octet ( valeur numérique de type Byte) que tu traduis en chaine de caractères hexadécimale : 127 devient 7F) . Ensuite tu "cryptes" cette chaine selon tes paramètres. Puis tu traduis ta chaine cryptée en une nouvelle valeur décimale de type Byte !
Je me posais la question si il n'y avait pas moyen de crypter directement sur l'octet sans passer par cette chaine hexadécimale
intermédiaire .
Regarde pour StrReverse ( qui n'existe pas en pur VB Net d'ailleurs)
l'octet 127 ( soit 7F en hexa devient F7) soit 247
Tu as une conversion Byte-Hexa puis une conversion Hexa-Byte
Avec des décalages logiques on travaille directement sur l'octet sans passer par la double conversion ! et ces conversions prennent du temps surtout répétées deux fois par octet
Si tu penses que le sujet est résolu n'oublies pas de l'indiquer tout en haut de ce post en cliquant "Marquer comme résolu"
µbonne fin de journée à toi
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
>
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021

                    For a As Integer = 0 To X - 1
If a = n Then
DataLeng = nbOctetL
End If
Dim dataArray(DataLeng) As Byte
file.Read(dataArray, 0, DataLeng)
For i As Integer = 0 To DataLeng
dataArray(i) = crypt(dataArray(i), Key)
Next i
fileCrpt.Write(dataArray, 0, DataLeng)
EndOfCryptBar.Value = file.Position
Application.DoEvents()
Next a


Du coup il est vrai que sans conversion sa ça beaucoup plus vite, je vais essayer de le convertir ma fonction de cryptage ascii en bytes pour le faire fonctionner :D

Merci pour tous les conseils.

Si tu est intéresser a voir en quoi tu as contribué envoi un MP je t'enverait le soft quand j'ai fini