IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Débutant: compréhension code et conversion en VB


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Débutant: compréhension code et conversion en VB
    Bonjour,

    Tout d'abord je m'excuse car je n'ai pas de connaissance en Java et ma question peut probablement sembler triviale à beaucoup d'entre vous.

    Je désire convertir le code ci-dessous de Java vers VB (ou VBA):
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      public static String thesub(byte[] paramArrayOfByte)
      {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < paramArrayOfByte.length; i++)
        {
          int j = paramArrayOfByte[i] & 0xFF;
          sb.append("0123456789abcdef".charAt(j >> 4));
          sb.append("0123456789abcdef".charAt(j & 0xF));
        }
        return sb.toString();
      }
    A priori il s'agit d'un encodage et l'input devrait être un string quelconque (même si la variable est décalrée comme un tableau byte).

    Mon problème est que je ne comprend pas ce que signifient les instructions " & 0xFF", "j >> 4", et "j & 0xF" en Java. La conversion en VB est la suivante, où j'ai mis des ????? aux endroits pour lesquels je ne comprends pas le code Java:
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Public Function thesub(ByRef TheInput() As Byte) As String
            Const TheKey As String = "0123456789abcdef"
            Dim i As Long, j As Long
            Dim SB As New System.Text.StringBuilder
            For i = 0 To UBound(TheInput, 1) - 1
                j = TheInput(i) & "0xFF" ' ?????
                SB.Append(Mid(TheKey, j mod 4, 1)) ' ????
                SB.Append(Mid(TheKey, j & "0xF", 1)) ' ????
            Next i
            thesub = SB.ToString
        End Function

    Comment convertir correctement ce code Java en VB?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Casey_ Voir le message
    A priori il s'agit d'un encodage et l'input devrait être un string quelconque (même si la variable est décalrée comme un tableau byte).
    Encodage c'est un bien grand mot .

    En résumé cette méthode prend des octets et renvoie leur représentation en hexadécimal (en minuscules).

    Exemple : si on lui envoie un tableau de 3 octets 0x00 suivi de 0x8F suivi de 0x56, cette méthode va renvoyer la String "008f56".

    *********************
    Edit : je réponds quand même aux question :

    " & 0xFF",
    L'opérateur & fait un "et binaire bit-à-bit" sur deux nombres : les deux opérandes sont considérées comme des champs de bits, et le résultat est un autre champ de bits, où chaque bit est le "et logique" des deux bits correspondants des opérandes.

    0xFF est un nombre noté en hexadécimal. Vu que F est le plus grand chiffre hexadecimal, c'est le plus grand nombre noté sur deux chiffres hexédicmaux. Autrement dit, le plus grand nombre non signé sur 8 bits.

    "& 0xFF" consiste donc à laisser les 8 bits de poids faible d'un nombre inchangés, et mettre les autres à zéro.

    Ici, il sert à contourner une limitation de Java : les bytes Java sont signés, donc ils vont de -128 à 127. Un byte "plus grand que 127" serait donc un byte négatif. Pour appeler charAt(), on passe un int en paramètre.
    Il y a donc conversion byte => int, mais si le byte est négatif, le int sera considéré négatif aussi. Donc un "byte plus grand que 127" sera converti en int négatif. En appliquant ensuite & 0xFF, le int prend la valeur du byte comme s'il était non signé.

    "j >> 4",
    Décalage de 4 bits vers la droite : tous les bits du nombre se déplacent de 4 positions à droite, et les 4 bits les plus faibles sont perdus.

    Comme le nombre en question était déjà réduit à 8 bits, cela le réduit aux 4 bits de poids forts des 8 bits en question. 4 bits, ça fait 16 combinaisons différentes : un chiffre hexadécimal.

    et "j & 0xF"
    Comme 0xFF, mais en limitant à un chiffre hexadécimal au lieu de deux.

    Cela permet de réduire aux 4 bits de poids faible des 8 bits précédents.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour les explications !
    N'étant pas non plus familier avec ce type d'opérations sous VB, cela me prendra un peu de temps.
    Néanmoins je promets de poster ici le code converti une fois que je l'aurai trouvé.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    J'y connais rien en VB, mais c'est sûrement pas compliqué de lui faire écrire la représentation hexadécimale d'un tableau d'octets.

    'Faut pas chercher à porter le code Java en VB, ça sert à rien. VB a sa propre manière pour représenter des octets en hexadécimal. C'est ça qu'il faut utiliser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    Il n'existe pas en VB de fonction de décalage de bits.
    Donc dans votre cas, il va falloir ruser:

    * 'J >> 4' effectue un décallage de 4 bits vers la droite, cela revient à diviser J par 16. On utilise le décalage de bits car c'est beaucoup plus rapide au niveau du µProcesseur que la division. Donc pour cette instruction, vous avez une solution.

    * 'J & 0xF' sert à filtrer les 4 bits les plus faibles de J. Si J vaut 170 en décimale, soit 10101010 en binaire, alors 'J & 0xF' signifie 10101010 & 00001111 ce qui donne 00001010. Cela fonctionne aussi en VB. Donc vous avez aussi la solution à ce problème.

    Le plus grosse difficulté aurait été de programmer la méthode append

    @ bientôt...
    @ bientôt...

    Salut & @+ sur 3W!

Discussions similaires

  1. [Débutant] Problème compréhension code XAML
    Par JolyLoic dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 26/08/2009, 17h00
  2. [Débutant] Compréhension de code
    Par sebatlante dans le forum x86 16-bits
    Réponses: 10
    Dernier message: 18/01/2009, 17h10
  3. [débutant] Compréhension de code II
    Par isarian dans le forum C#
    Réponses: 19
    Dernier message: 07/03/2008, 10h27
  4. [débutant] Compréhension de code
    Par isarian dans le forum C#
    Réponses: 8
    Dernier message: 05/03/2008, 11h30
  5. [Débutante] Compréhension programme - mode debug
    Par bolo dans le forum Assembleur
    Réponses: 14
    Dernier message: 07/01/2005, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo