Checksum - Pb dépassement capacité variable

dede38440 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
dede38440 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

je programme en ce moment une application en Visual Basic qui nécessite un checksum (calculé à partir d'une chaîne de caractères allant de 4 à une 20ène de caractères) que voici :

variableT = TextBox6.Text

        Dim buff() = System.Text.Encoding.ASCII.GetBytes(variableT.ToLower() + "0")

        Dim v3 As Integer = 0
        Dim v30 As Integer = 0
        Dim v31 As Integer = 0
        Dim v29 As Integer = 0
        
        If buff(0) <> 0 Then

            While buff.Length - 1 <> v30

                v3 = buff(v30)
                v31 = (v29 << 5) - v29 + v3
                v30 += 1
                v3 = buff(v30)

                v29 = v31

            End While

            If v31 < 0 Then
                v29 = -v31
            End If
        End If
        Dim v32 As Integer = v29 Mod 8
        Msgbox(v32)


Mon soucis est que les variables v30 et v29 saturent rapidement suivant le nombre de caractère; même en les passant en Double ou Long les variables saturent.

En C++, C et C# ça fonctionne comme sur des roulettes donc je ne comprends pas pourquoi pas en VB.. Code en C# (fonctionne) :

byte[] buff = System.Text.Encoding.ASCII.GetBytes(variableT.ToLower() + "0");

        int v3 = 0;
        int v30 = 0;
        int v31 = 0;
        int v29 = 0;
        if (buff[0] != 0)
        {
            while (buff.Length - 1 != v30)
            {
                v3 = buff[v30];
                v31 = v29 << 5;
                v31 -= v29;

                v31 += v3;
                v30++;
                v3 = buff[v30];
                v29 = v31;
            }

            if (v31 < 0)
                v29 = -v31;
        }
        int v32 = v29 % 8;
        return v32;


J'ai longuement cherché et ai pensé qu'étant donné qu'à la fin on fait un modulo 8 sur la somme, je pouvais tronquer les parties binaires et gardé ainsi que les 5 premiers chiffres binaires pour continuer l'algorithme; ce fut un échec.

J'espère avoir été suffisamment clair sinon je me réexpliquerai si le besoin est.

Merci par avance, je suis ouvert à toutes idées

4 réponses

  1. Iama Messages postés 324 Statut Membre 14
     
    Bonjour

    Chez moi

    Dim v3 As Integer = 0
    ne fonctionne pas

    mais
    Dim v3 As Integer
    v3 = 0
    oui

    Et tout passer en variant, pour voir ce qu'a choisi Vba ?

    Cordialement
    c'est peu
    0
  2. dede38440 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour, merci pour l'aide.

    Le soucis de déclaration de variable doit dépendre de la version; donc pas de soucis à ce niveau là.

    J'ai donc testé de passé les variables en Variant (ou Object suivant les versions), l'algorithme fonctionne lorsque j'ai 6 caractères en entrée (la variable Variant est alors associée à une de type Long), au delà l'algorithme ne fonctionne plus (la variable Variant est associée à une de type LongLong).

    Cordialement dede38440
    0
  3. Iama Messages postés 324 Statut Membre 14
     
    Bonjour

    Alors, avec mes faible connaissances je bloque.
    L'évolution de buff?

    cordialement
    0
  4. dede38440 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    en gros l'algorithme est un checksum se réduisant à :

    Tant que buff contient des caractères
    var1=var0*31+car
    var0=var1
    Loop

    (car est la valeur décimale du caractère)

    Le soucis étant que les variables var1 et var0 sont vite surchargées.

    Cordialement dede38440
    0