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

jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention - 15 mai 2016 à 16:05 - Dernière réponse : jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention
- 17 mai 2016 à 21:15
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 !

Afficher la suite 

14 réponses

Répondre au sujet
NHenry 14132 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 21 avril 2018 Dernière intervention - 15 mai 2016 à 16:34
0
Utile
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.
Commenter la réponse de NHenry
jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention - Modifié par jboss38 le 15/05/2016 à 21:40
0
Utile
12
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
jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention - 16 mai 2016 à 23:42
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
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention - 17 mai 2016 à 01:51
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
jboss38 > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 17 mai 2016 à 14:38
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.
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > jboss38 - 17 mai 2016 à 16:40
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
jboss38 831 Messages postés samedi 4 octobre 2008Date d'inscription 14 décembre 2016 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 17 mai 2016 à 21:15
                    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
Commenter la réponse de jboss38

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.