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

VB.NET Discussion :

Traduire le type Byte* en vb.NET ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Traduire le type Byte* en vb.NET ?
    Bonjour à tous, je sais que ma demande risque de ne pas être bien percu puisqu'il s'agit de traduire un code qui n'est pas de moi mais c'est une partie importante qui va déterminer la suite que je peux donner à mon programme sans autre solution que celle-çi.

    Je bute en fait sur cet unique problème :
    Que signifie cette astérisque après le type byte et comment traduire ca en vb.NET ? La traduction que je donne ci-dessous en vb.NET est approximative (converti par le site Telerik) et demande à être retouché pour coller au code C#.
    Vous me seriez vraiment d'un grand secours si vous pouviez m'aider la dessus.

    Code C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       [MethodImpl(MethodImplOptions.AggressiveInlining)]
            protected static unsafe int ToInt32(byte[] value, int startIndex) {
                fixed (byte* pbyte = &value[startIndex]) {
                    if (startIndex % 4 == 0) return *(int*)pbyte;
                    return BitConverter.IsLittleEndian
                            ? *pbyte | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24)
                            : (*pbyte << 24) | (*(pbyte + 1) << 16) | (*(pbyte + 2) << 8) | *(pbyte + 3);
                }
            }
    Code vb.NET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      <MethodImpl(MethodImplOptions.AggressiveInlining)>
            Protected Shared Function ToInt32(value As Byte(), startIndex As Integer) As Integer
                Dim pByte As Byte = value(startIndex)
                If startIndex Mod 4 = 0 Then
                    Return CType(pbyte, Pointer(Of Integer)).Target
                End If
                Return If(BitConverter.IsLittleEndian, pbyte.Target Or ((pbyte + 1).Target << 8) Or ((pbyte + 2).Target << 16) Or ((pbyte + 3).Target << 24), (pbyte.Target << 24) Or ((pbyte + 1).Target << 16) Or ((pbyte + 2).Target << 8) Or (pbyte + 3).Target)
     
            End Function
    En vous remerciant par avance.

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    En c# ces asterisk correspondent à du code unsafe, en somme basé sur les pointeurs. VbNet ne gère pas le code Unsafe donc il faut que tu te tournes vers du marshalling tout simplement (la Classe Marshall).

    A+

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Merci de me venir en aide wallace1 mais pour le coup je comprends encore moins
    je crois que je vais avoir besoin de comprendre le fonctionnement de la fonction ToInt32 dans sa globalité et ce qu'a cherché à faire son auteur pour m'en sortir mais j'avoue que je ne comprends pas du tout la fonction et à quoi sert du code unsafe ?
    En fouillant j'ai trouvé néanmoins ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MyInteger As Integer = Marshal.ReadInt32(MyPointer)
    qui ressemble vaguement à la fonction ToInt32. Ça voudrais dire que je peux remplacer l'ensemble de la fonction par ce bout de code ? Je n'en suis pas sûre du tout.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bonjour à tous, malgré toute ma bonne volonté je n'ai pas avancé beaucoup sur le sujet.
    Je me dit que je pourrais essayer de tester le code en suppriment toute la partie unsafe à condition que le code arrive à ce compiler.

    Mais je suis tombé sur un autre exemple un peu similaire qui utilise l'indexation sur les variables de type byte, après vérification c'est cette astérisque qui autorise l'indexation. En vb.NET, je n'ai pas trouvé d'équivalent a ces variables numPtr(x) qui ne se compile pas.

    Je sais pas si je suis très clair et je ne sais pas vraiment ce que je fait pour le coup , j’espère que vous pourrez m'aider.


    Code C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      [MethodImpl(MethodImplOptions.AggressiveInlining)]
            protected static unsafe long ToInt64(byte[] value, int startIndex) {
                fixed (byte* numPtr = &value[startIndex]) {
                    if (startIndex % 8 == 0) return *(long*)numPtr;
                    if (BitConverter.IsLittleEndian) {
                        return (uint)(*numPtr | numPtr[1] << 8 | numPtr[2] << 16 | numPtr[3] << 24) |
                                (long)(numPtr[4] | numPtr[5] << 8 | numPtr[6] << 16 | numPtr[7] << 24) << 32;
                    }
     
                    int num = *numPtr << 24 | numPtr[1] << 16 | numPtr[2] << 8 | numPtr[3];
                    return (uint)(numPtr[4] << 24 | numPtr[5] << 16 | numPtr[6] << 8) | numPtr[7] | (long)num << 32;
                }
            }
    Code vb.NET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        <MethodImpl(MethodImplOptions.AggressiveInlining)>
        Protected Shared Function ToInt64(value As Byte(), startIndex As Integer) As Long
            Dim numPtr As Byte = value(startIndex)
            If startIndex Mod 8 = 0 Then
                Return CType(numPtr, Pointer(Of Long)).Target
            End If
            If BitConverter.IsLittleEndian Then
                Return CUInt(numPtr.Target Or numPtr(1) << 8 Or numPtr(2) << 16 Or numPtr(3) << 24) Or
                    CLng(numPtr(4) Or numPtr(5) << 8 Or numPtr(6) << 16 Or numPtr(7) << 24) << 32
            End If
     
            Dim num As Integer = numPtr.Target << 24 Or numPtr(1) << 16 Or numPtr(2) << 8 Or numPtr(3)
            Return CUInt(numPtr(4) << 24 Or numPtr(5) << 16 Or numPtr(6) << 8) Or numPtr(7) Or CLng(num) << 32
     
        End Function

  5. #5
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    les fonctions que tu veux traduire sont vraiment ces conversions ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bonjour jopopmk,
    Oui ce sont bien ces 2 fonctions C# que je voudrais traduire en vb.NET. Je n'ai pas changé une virgule au code C# par contre le code vb.NET est une traduction du site Telerik, ça vaux ce que ça vaux.
    Une idée pour traduire ça ? Par quoi commencer ? Déjà j'ai du mal à comprendre le code C#, je ne sais pas très bien ce qu'il fait.

Discussions similaires

  1. comparer 2 tableaux de bytes en vb.net
    Par niceen dans le forum VB.NET
    Réponses: 6
    Dernier message: 29/04/2008, 19h03
  2. afficher type byte
    Par ado.net dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/04/2008, 21h02
  3. Mise à zéro d'un tableau type byte[]
    Par =o0 MOH =0o= dans le forum C#
    Réponses: 4
    Dernier message: 03/04/2007, 15h24
  4. mysql et hibernate type byte
    Par *alexandre* dans le forum Hibernate
    Réponses: 1
    Dernier message: 01/09/2006, 09h51
  5. Type byte ou equivalent
    Par barucca dans le forum C
    Réponses: 9
    Dernier message: 24/06/2004, 15h05

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