Convertion c++ à VB

jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012 - 19 nov. 2006 à 05:34
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008 - 22 nov. 2006 à 14:26
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

NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
19 nov. 2006 à 14:58
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
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
19 nov. 2006 à 23:37
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-
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 nov. 2006 à 08:40
il multiplie par deux checksum...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
20 nov. 2006 à 14:16
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-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 nov. 2006 à 14:23
00110010 => 50 en base 10
01100100 => 100 en base 10

on a donc bien multiplié par deux...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
20 nov. 2006 à 22:33
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-
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 nov. 2006 à 08:46
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
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
22 nov. 2006 à 14:26
Zut j'ai oublié checksum = checksum << 1 dans ma réponse :P
0
Rejoignez-nous