Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 VBA : Calcul checksum xor d'une chaine de longueur variable

decolit

XLDnaute Nouveau
Bonjour à tous,

Tout d'abord, je souhaite santé et réussite à tous pour 2021 !
J'ai essayé d'utiliser des fonctions d'excel type BITOUEXCLUSIF() pour calculer un checksum xor d'une chaine alphanumérique de longueur X (=X caractères), après avoir calculé la valeur ascii de chaque caractère au moyen de la fonction code(). Le checksum calculé doit être converti en hexadécimal.
Si le checksum hexadécimal ne comporte qu'un seul caractère, alors il faut "ajouter" un zéro avant le checksum, de sorte que tous les checksum aient une longueur de 2 digits.
Ca marche quand il y a quelques lignes, mais c'est beaucoup trop lourd et long quand le fichier comporte 100000 lignes.
Dans le tableur joint, je donne un exemple de ce que je souhaite faire :

- soit A la colonne contenant les chaines à checksumiser, il peut y avoir Y chaines à traiter
- soit B la colonne contenant le checksum xor de la chaine correspondante en colonne A
- une fois ce checksum calculé, j'ai besoin de concaténer la chaine avec le checksum correspondant dans la colonne C.
J'ai utilisé https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/ pour vérifier les checksum.
J'ai donc besoin d'encoder tout ça en VBA pour avoir un algorithme. Je suis proprement incapable de le faire car VBA est opaque pour moi, même si je sais qu'il existe la fonction xor.

Je vous remercie par avance pour votre aide.
 

Pièces jointes

  • Checskum XOR_test.xlsx
    9.2 KB · Affichages: 9

soan

XLDnaute Barbatruc
Inactif
@decolit

en fin de post, nouvelle version du fichier.

VB:
Option Explicit

Sub Essai()
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row: If n = 1 Then Exit Sub
  Dim Tbl, chn$, lng As Byte, c As Byte, p As Byte, i&
  Tbl = [A1].Resize(n, 2): Tbl(1, 2) = "string 2"
  For i = 2 To n
    chn = Tbl(i, 1): lng = Len(chn): c = 0
    If lng > 0 Then
      For p = 1 To lng
        c = c Xor Asc(Mid$(chn, p, 1))
      Next p
      Tbl(i, 2) = chn & Right$("0" & Hex$(c), 2)
    End If
  Next i
  Application.ScreenUpdating = 0: [A1].Resize(n, 2) = Tbl
End Sub
soan
 

Pièces jointes

  • Exo decolit.xlsm
    14.5 KB · Affichages: 4

decolit

XLDnaute Nouveau
@soan,
longueur chaine : dans l'énoncé de mon besoin je décris "calculer un checksum xor d'une chaine alphanumérique de longueur X (=X caractères)", je n'ai pas limité la longueur de la chaine.

- si je lance la macro "essai()" par le menu macro de l'onglet développeur : pas de problème le checksum est bien calculé et ajouté à la chaine, la nouvelle chaine créée est bien dans la colonne B, c'est parfait.

- si je fais Ctrl e : recopie chaque chaine dans la colonne B mais ajoute un espace et le chiffre 2 après, le checksum n'est pas calculé.

?
 

soan

XLDnaute Barbatruc
Inactif
pour la longueur chaîne et X (=X caractères) : tu as raison ; mais je l'avais oublié
car dans le fichier de l'énoncé, toutes les chaînes sont de 10 caractères : j'avais
pensé que c'était normalisé.

pour ce que tu dis ensuite, c'est avec le fichier de quel post ?

as-tu essayé le fichier de mon post #16 ?


soan
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…