Convertion c++ à VB

Signaler
Messages postés
258
Date d'inscription
samedi 25 décembre 2004
Statut
Membre
Dernière intervention
13 novembre 2012
-
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008
-
Bonjours,
Je ne suis pas très connaissant en c++.
Est-ce que quelqu'un pourrait me traduire cette fonction en Visual Basic 6.0 ou .NET.
P.S.: le pucData est en général à l'adresse 0C en hexadécimal dans le fichier.


// pucData - pointer to the byte stream of the .d2s file

// iSize - number of bytes in the stream ( filesize )

void Checksum( unsigned char *pucData, int iSize )

{

// delete old checksum at offset 0x0C (0C est l'adresse des valeurs changer. On doit mettre les 8 bits

*((unsigned int*)(pucData+12)) = 0;

// init new checksum with 0

unsigned int uiCS = 0;

// this is the whole checksum calculation

for ( int i = 0; i < iSize; ++i )

uiCS = (uiCS<<1) + pucData[i] + ( uiCS & 0x80000000 ? 1 : 0 );

// write new checksum to stream

*((unsigned int*)(pucData+12)) = uiCS;

}

Voiçi un autre fonction en c++ qui devrait faire la même chose que celui du haut, mais n'est pas réaliser par le même programmeur:
Autre fonction identique:
void Character::calculateChecksum()
{
   // make sure we start at the beginning of the file
   std::rewind(charfile);

   Checksum = 0;

   unsigned char data, overflow = 0;

   for (unsigned long i = 0; i < FileSize; ++i)
   {
      // doubles the checksum result by left shifting once
      Checksum <<= 1;

      std::fread(&data, sizeof(data), 1, charfile);

      Checksum += data + overflow;

      if (Checksum < 0)
         overflow = 1;
      else
         overflow = 0;
   }

   // rewind the file in case we need to read/write to it again
   std::rewind(charfile);

Je ne vous force pas!! C'est seulement un petit service que je vous demande!!

J'ai beau lire et relire les 2 fonctions, je ne les comprend pas! En tout cas, merci à ceux qui auront la gentillesse de m'aider!

Merci!

-Jn-

8 réponses

Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Bonjour,

Convertion de la methode deux :

Imports System.IO

   Dim FileSize As Integer ' doit etre defini dans une autre methode
    Dim br As BinaryReader  ' doit etre initialiser dans une autre methode



    Sub CalculateCheckSum()



        ' Exemple : Initialisation variable br
        ' Dim fs As New FileStream("C:\\fichier.bin", FileMode.OpenOrCreate)
        ' Dim br As BinaryReader = New BinaryReader(fs)
        br.BaseStream.Position = 0



        Dim checksum As Integer
        Dim data As Byte
        Dim overflow As Byte



        For i As Long = 0 To i < FileSize
            data = br.ReadByte()
            checksum = checksum + data + overflow
            If checksum < 0 Then
                overflow = 1
            Else
                overflow = 0
            End If
        Next

      br.BaseStream.Position = 0



    End Sub
Messages postés
258
Date d'inscription
samedi 25 décembre 2004
Statut
Membre
Dernière intervention
13 novembre 2012

Salut,
merci pour cette réponse.

Lorsque je l'aissai sur un fichier, checksum me donne 0. Pourtant le fichier n'est pas vide... Pour trouver la grosseur, j'utilise FileSize = CInt(FileLen(FilePath)).

Au fait, que fait cette ligne en c? :

Checksum <<= 1;

Merci

-Jn-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
il multiplie par deux checksum...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
258
Date d'inscription
samedi 25 décembre 2004
Statut
Membre
Dernière intervention
13 novembre 2012

Merci de la réponse, mais ce n'est pas ça. J'ai résolu le problème.

Pour ceux qui veulent le savoir, chiffe << 1 est un bit shift. Il pousse toute les bits de un vers la gauche dans l'octet sélectionné. Par exemple,

00110010 << 1 donne : 01100100

Dans l'algorithme, on additionne tous les bits de 2 octets, ensuite on "bitshift" de 1 vers la gauche le résultat, et on continue. Ce qui donne en vb:

        FileSize = CInt(FileLen(FilePath))
        br.BaseStream.Position = 0

        Do While i < FileSize
            data = br.ReadByte() ' on lit l'octet

            checksum = checksum << 1 'on bitshift vers la gauche de 1

            checksum = checksum + data + overflow ' on addition l'octet séléctionné

            If checksum < 0 Then ' on vérifi s'il y a dépassement
                overflow = 1
            Else
                overflow = 0
            End If
            i = i + 1
        Loop

-Jn-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
00110010 => 50 en base 10
01100100 => 100 en base 10

on a donc bien multiplié par deux...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
258
Date d'inscription
samedi 25 décembre 2004
Statut
Membre
Dernière intervention
13 novembre 2012

Oui c'est bien une multiplication, mais je demandais une explication... pas un synonyme. À ce que je sache, bitshift ne veux pas dire multiplication. Je voulais comprendre ce que faisais le "<<". Oui ca revient bien à une multiplication, mais ce n'est pas la définition exacte. Dans un examen j'aurais eu un beau 0!

-Jn-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ok sur la définition....

j'étais resté sur le "que fait cette ligne" et t'ai donc donné une "lecture" de la ligne

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Zut j'ai oublié checksum = checksum << 1 dans ma réponse :P