Checksum - Pb dépassement capacité variable

Fermé
dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014 - Modifié par dede38440 le 22/08/2014 à 13:38
dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014 - 24 août 2014 à 20:08
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
A voir également:

4 réponses

Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
23 août 2014 à 17:34
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
dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014
23 août 2014 à 19:58
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
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
24 août 2014 à 09:51
Bonjour

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

cordialement
0
dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014
Modifié par dede38440 le 24/08/2014 à 20:08
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