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

Macros et VBA Excel Discussion :

Aide codage caractères spéciaux


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Mars 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Mars 2021
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Aide codage caractères spéciaux
    Bonjour,

    J'ai besoin de votre aide pour une problématique que j'ai sur un code VBA. (je suis débutant)

    Mon code permet, via une fonction, d'hacher une donnée avec une clé secrète via l'algorithme HMAC SHA1.

    Le problème est que la clé (variable String) peut contenir des caractères spéciaux, or l'encodage UTF8 transforme ces caractères (exemple "«" devient "«").
    Et du coup, lorsque la fonction convertit la caractère sur 8 bits ça donne pas du tout ce que je souhaite.

    En changeant, l'UTF8 par l'Unicode (Set asc = CreateObject("System.Text.UnicodeEncoding"), je retrouve le bon code de caractère mais sur 16 bits mais je le voudrais sur 8 bits... des idées ?



    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
    16
    17
    18
    19
    20
    Public Function HEX_HMACSHA1(ByVal sTextToHash As String, ByVal sSharedSecretKey As String)
    Dim asc As Object, enc As Object
    Dim TextToHash() As Byte
    Dim SharedSecretKey() As Byte
     
    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")
     
     
    TextToHash = asc.Getbytes_4(sTextToHash)
    SharedSecretKey = asc.Getbytes_4(sSharedSecretKey)
    enc.Key = SharedSecretKey
     
    Dim Bytes() As Byte
    Bytes = enc.ComputeHash_2((TextToHash))
    HEX_HMACSHA1 = ConvToHexString(Bytes)
    Set asc = Nothing
    Set enc = Nothing
     
    End Function

  2. #2
    Membre habitué
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 86
    Points : 134
    Points
    134
    Par défaut
    Je suppose que ton algorithme est en C.
    Je t'extrait ici un bout de code qui me sert à utiliser avec VBA des modules écrits en C, la Function VBStringFromPtrW renvoie une chaine ASCII de la chaine UNICODE qui est à une adresse donnée de la mémoire vive (que tu trouve avec StrPtr).
    Il utilise la bibliothèque Kernel32.
    Bien enregistrer avant toute tentative, car les erreurs de pointeurs mémoire font un superbe plantage d'Excel et tu perds tout.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    Option Explicit
     
    ' Procédures de manipulation de chaine désignée par un pointeur (voir à la fin de ce module)
     
    Public Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long
    'Détermine la longueur de la chaîne spécifiée (n'incluant pas le caractère nul final).
    'Syntax
    ' int lstrlenW(
    '  LPCWSTR lpString
    ' );
    '
    'Parameters
    ' lpString Type: LPCTSTR Pointeur sur la chaîne UNICODE terminée par un zéro à vérifier.
    '
    'Return Value Type: int
    ' La fonction renvoie la longueur de la chaîne, en caractères.
    ' Si String est NULL, la fonction renvoie 0.
    '
    ' Si unicode est UTF16, la chaine occupe nb caractères x 2 octets en mémoire plus le NULL.
     
    Public Const CP_ACP = 0
     
    Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, _
                                                                ByVal dwFlags As Long, _
                                                                lpWideCharStr As Any, _
                                                                ByVal cchWideChar As Long, _
                                                                lpMultiByteStr As Any, _
                                                                ByVal cchMultiByte As Long, _
                                                                ByVal lpDefaultChar As String, _
                                                                ByVal lpUsedDefaultChar As Long _
                                                                ) As Long
    ' Mappe une chaîne UTF-16 (caractères larges) sur une nouvelle chaîne de caractères.
    ' La nouvelle chaîne de caractères n'est pas nécessairement dans un jeu de caractères
    ' multi-octets.
    '
    'https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-widechartomultibyte
    '
    'int WideCharToMultiByte(
    '  UINT                               CodePage,
    '  DWORD                              dwFlags,
    '  _In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr,
    '  int                                cchWideChar,
    '  LPSTR                              lpMultiByteStr,
    '  int                                cbMultiByte,
    '  LPCCH                              lpDefaultChar,
    '  LPBOOL lpUsedDefaultChar
    ');
    ' WideCharToMultiByte(page:CP_ACP, flag:0, pointeur:ByVal lpszW, taille:-1, tamponrecu:ByVal sRtn, taille:Len(sRtn), 0, 0)
    ' codepage : Page de code à utiliser pour effectuer la conversion.
    '            Ce paramètre peut être défini sur la valeur de toute page de code installée
    '            ou disponible dans le système d'exploitation.
    ' dwFlags : Drapeaux indiquant le type de conversion.
    '           L'application peut spécifier une combinaison des valeurs suivantes.
    '           La fonction est plus rapide si aucun de ces drapeaux n’est défini.
    '           L'application doit spécifier WC_NO_BEST_FIT_CHARS et WC_COMPOSITECHECK avec
    '           la valeur spécifique WC_DEFAULTCHAR pour extraire tous les résultats de
    '           conversion possibles. Si les trois valeurs ne sont pas fournies, certains
    '           résultats seront manquants.
    ' lpWideCharStr : Pointeur sur la chaîne Unicode à convertir.
    ' cchWideChar : Taille, en caractères, de la chaîne indiquée par lpWideCharStr.
    '               Alternativement, ce paramètre peut être défini sur -1 si la chaîne est terminée
    '               par la valeur NULL. Si cchWideChar est défini sur 0, la fonction échoue.
    '               Si ce paramètre est égal à -1, la fonction traite la chaîne d'entrée entière,
    '               y compris le caractère nul final. Par conséquent, la chaîne de caractères
    '               résultante a un caractère nul final et la longueur renvoyée par la fonction
    '               inclut ce caractère.
    '               Si ce paramètre est défini sur un entier positif, la fonction traite
    '               exactement le nombre de caractères spécifié. Si la taille fournie n'inclut pas
    '               un caractère nul final, la chaîne de caractères résultante n'est pas terminée
    '               par un caractère nul et la longueur renvoyée n'inclut pas ce caractère.
    ' lpMultiByteStr : Pointeur sur un tampon qui reçoit la chaîne convertie.
    ' cchMultiByte : Taille, en octets, du tampon indiqué par lpMultiByteStr.
    '                Si ce paramètre est défini sur 0, la fonction retourne la taille de tampon
    '                requise pour lpMultiByteStr et n'utilise pas le paramètre de sortie lui-même.
    ' lpDefaultChar : Pointeur sur le caractère à utiliser si un caractère ne peut pas être
    '                 représenté dans la page de code spécifiée.
    '                 L'application définit ce paramètre sur NULL si la fonction doit utiliser
    '                 une valeur par défaut du système.
    '                 Pour obtenir le caractère par défaut du système, l'application peut appeler
    '                 la fonction GetCPInfo ou GetCPInfoEx.
    '                 Pour les paramètres CP_UTF7 et CP_UTF8 pour CodePage, ce paramètre doit être
    '                 défini sur NULL.
    '                 Sinon, la fonction échoue avec ERROR_INVALID_PARAMETER.
    ' lpUsedDefaultChar : Pointeur sur un drapeau qui indique si la fonction a utilisé un
    '                     caractère par défaut lors de la conversion.
    '                     Le drapeau est défini sur TRUE si un ou plusieurs caractères de la
    '                     chaîne source ne peuvent pas être représentés dans la page de codes
    '                     spécifiée.
    '                     Sinon, le drapeau est défini sur FALSE. Ce paramètre peut être défini
    '                     sur NULL.
    '                     Pour les paramètres CP_UTF7 et CP_UTF8 pour CodePage, ce paramètre doit
    '                     être défini sur NULL.
    '                     Sinon, la fonction échoue avec ERROR_INVALID_PARAMETER.
    '
    'Return Value
    ' If successful, renvoie le nombre d'octets écrits dans le tampon pointé par lpMultiByteStr.
    '  Si la fonction réussit et que cbMultiByte a la valeur 0, la valeur de retour est la taille
    '  requise, en octets, pour le tampon indiqué par lpMultiByteStr.
    '  Reportez-vous également à dwFlags pour obtenir des informations sur la manière dont
    '  l'indicateur WC_ERR_INVALID_CHARS affecte la valeur de retour lorsque des séquences
    '  non valides sont entrées.
    'La fonction renvoie 0 si elle ne réussit pas.
    ' Pour obtenir des informations d'erreur étendues, l'application peut appeler GetLastError,
    ' qui peut renvoyer l'un des codes d'erreur suivants:
    '  ERROR_INSUFFICIENT_BUFFER. La taille de la mémoire tampon fournie n'était pas assez grande
    '  ou elle était définie incorrectement sur NULL.
    '  ERROR_INVALID_FLAGS. Les valeurs fournies pour les indicateurs n'étaient pas valides.
    '  ERROR_INVALID_PARAMETER. Aucune des valeurs de paramètre n'était invalide.
    '  ERROR_NO_UNICODE_TRANSLATION. Unicode non valide a été trouvé dans une chaîne.
    '
    'Remarks
    ' Les pointeurs lpMultiByteStr et lpWideCharStr ne doivent pas être identiques.
    ' S'ils sont identiques, la fonction échoue et GetLastError renvoie ERROR_INVALID_PARAMETER.
    ' WideCharToMultiByte ne met pas à zéro une chaîne de sortie si la longueur de la chaîne
    ' d'entrée est explicitement spécifiée sans caractère nul de fin.
    ' Pour mettre fin à une chaîne de sortie pour cette fonction, l'application doit passer -1
    ' ou compter explicitement le caractère nul de fin pour la chaîne d'entrée.
    ' Si cbMultiByte est inférieur à cchWideChar, cette fonction écrit le nombre de caractères
    ' spécifié par cbMultiByte dans le tampon indiqué par lpMultiByteStr. Toutefois, si CodePage
    ' est défini sur CP_SYMBOL et que cbMultiByte est inférieur à cchWideChar, la fonction
    ' n'écrit aucun caractère dans lpMultiByteStr.
     
     
    ' Function StrPtr(Texte As String) As Long
    ' Cette fonction de VB est volontairement planquée par MS, pas de doc.
    ' Elle renvoie l'adresse mémoire de la chaine.
     
    Public Function VBStringFromPtrW(ptrstrW As Long) As String
    ' Renvoie une chaîne ANSI d'un pointeur ptrstrW sur une chaîne Unicode
     
    Dim strRtn As String
    Dim Len_ptrstrW As Long
     
        If ptrstrW = 0 Then
            Stop
            VBStringFromPtrW = ""
            Exit Function
        End If
     
        Len_ptrstrW = lstrlenW(ByVal ptrstrW) ' Longueur de la chaîne associée au pointeur, exprimé en caractères
        strRtn = String$(Len_ptrstrW * 2 + 1, 0) ' On réserve la mémoire pour accueillir le résultat (2 bytes/char)
     
        ' Demande à Kernel32 de faire la conversion et de donner le résultat dans strRtn
        ' WideCharToMultiByte retourne également la longueur de chaîne Unicode
        Call WideCharToMultiByte(CP_ACP, 0, ByVal ptrstrW, -1, ByVal strRtn, Len(strRtn), 0, 0)
     
        If InStr(strRtn, vbNullChar) Then
            ' On ne prends que ce qui est avant le NULL
            VBStringFromPtrW = Left$(strRtn, InStr(strRtn, vbNullChar) - 1)
        Else
            ' Si strRtn n'a pas de caractère null, la fonction Left$ ci-dessus renvoit une
            ' chaîne de longueur nulle ("").
            VBStringFromPtrW = strRtn
        End If
     
    End Function
    Bonne digestion de ce code

Discussions similaires

  1. Liste de caractères spéciaux dans l'aide word 2007
    Par ragusadouble dans le forum Word
    Réponses: 1
    Dernier message: 25/08/2011, 19h39
  2. [MySQL] probleme de codage des caractères spéciaux
    Par rinuom99 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/11/2010, 15h42
  3. Codage des caractères spéciaux >_< !
    Par Invité dans le forum Général Python
    Réponses: 2
    Dernier message: 15/01/2009, 17h11
  4. Réponses: 6
    Dernier message: 13/08/2008, 21h31
  5. Réponses: 3
    Dernier message: 15/02/2008, 18h19

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