XL 2019 Traduire un array de bytes en string

xUpsilon

XLDnaute Accro
Bonjour,

Je travaille en ce moment sur l'exploitation de données sortant d'un mesurage 3D.
Mon problème est le suivant : les données sortant du mesurage sont envoyées dans une base de données SQL en étant déjà formatées, et notamment un champ qui correspond à la description des points mesurés. Dans SQL Server management, ce champ est décrit comme un type "image".
En essayant de faire un Query sur ce serveur, Power Query me renvoie l'indicatif "Binary" à la place de la valeur du champ, en me disant qu'il ne reconnait pas le type de la donnée.
J'ai donc essayé de contourner le problème en me disant qu'exécuter cette Query en VBA me permettrait peut-être de contourner le problème en effectuant mon traitement dans un array R correspondant au Rst.GetRows de la Query. Sauf qu'à l'heure actuelle, si je regarde dans mes variables locales pendant l'exécution, j'ai effectivement dans cet écran des arrays R2 de bytes qui remontent, mais je n'arrive pas à aller boucler sur ces R2 pour réussir à ressortir ces bytes sont forme de string.

Concrètement, ça ressemble à ça dans mes variables locales :
1700743625933.png


En fait, cet array de bytes représente déjà un écart par rapport à ce que je peux lire dans SQL Server Management car je suis en Hexa en SQL et en décimal en VBA, par exemple ici le même élément que ci-dessus (5E = 94, etc ...) :
1700743712911.png


Est-ce que quelqu'un a une idée pour traduire un array de bytes en string ? Que ce soit une solution en SQL ou en VBA, je suis preneur.

Merci et bonne journée,
 
Solution
il faut que tu revois la structure de tes type personnalisés ça plante dès la déclaration Dim Logs(1000) As Log

Édite.
Merci pour le -1 sans explications mais je confirme si on arrêt l'exécution de la macro après la déclaration Dim Logs etc ça plante

ici LittleInd(10000) As String tuas un dépassement de capacité c'est ça qui provoque le plantage

Édite2.
VB:
Type Scheibe
    Points(35, 1) As Integer
End Type

Type Log
    LittleInd As New Scripting.Dictionary   'Référence Microsoft Scripting Runtime
    ScheibCount As String
    Scheiben(80) As Scheibe
    Size As Double
    D1Min As String
    D1Max As String
    D1Angle As String
    DMMin As String
    DMMax As String
    DMAngle As String
    D2Min As String
    D2Max As String...

Dudu2

XLDnaute Barbatruc
Bonjour,
En réalité je ne comprends rien à ton problème.
Les Bytes sont des valeurs de caractères affichables ?
VB:
Sub a()
    Dim t(1 To 5) As Byte
    Dim S As String
    Dim i As Integer
  
    For i = 1 To 5
        t(i) = i + 64
    Next i
  
    For i = LBound(t) To UBound(t)
        S = S & Chr(t(i))
    Next i
  
    MsgBox "S = """ & S & """"
End Sub
 
Dernière édition:

scraper

XLDnaute Nouveau
Bonjour xUpsilon, Dudu2

VB:
Sub byteHex()
Dim bytArr(3) As Byte
bytArr(0) = 94
bytArr(1) = 2
bytArr(2) = 253

MsgBox ConvertByteToHex(bytArr(0))
MsgBox ConvertByteToHex(bytArr(1))
MsgBox ConvertByteToHex(bytArr(2))

End Sub
Public Function ConvertByteToHex(b As Byte)
  If Len(VBA.hex(b)) = 1 Then
     ConvertByteToHex = "0" & VBA.hex(b)
  Else
      ConvertByteToHex = VBA.hex(b)
End If
End Function
 

xUpsilon

XLDnaute Accro
Bonjour Dudu,

Mon problème est que je suis incapable de lire l'array de bytes.
J'ai un array (qui s'appelle arr dans mon exemple plus haut) qui est le résultat d'une Query SQL exécutée par VBA. Lorsque je récupère cet array qui équivaut à un SELECT dans une base de données SQL, il contient en gros deux champs : l'id, et les points. Les points sont en fait un champ SQL de type "image". Ce type image est lu par le SQL Server Management pour réussir à afficher des valeurs qui correspondent à des trucs comme ça :
1700748413818.png


Le 0x indique qu'il s'agit d'une valeur hexadécimale, puis on a un enchainement de valeurs, un peu comme un string. Gardons à l'esprit que cet espèce de string n'en est pas un, il ne s'agit que d'une manière de faire du SQL Server Management Studio pour illustrer les valeurs contenues dans le champ de type image.

En fait, ce que je veux, c'est que la valeur de type image (image étant donc un array de bytes) devienne réellement une valeur de type string (finalement, je souhaite avoir la valeur "visuelle" en tant que valeur retournée par ma Query).

Bonne journée,
 

xUpsilon

XLDnaute Accro
Bonjour xUpsilon, Dudu2

VB:
Sub byteHex()
Dim bytArr(3) As Byte
bytArr(0) = 94
bytArr(1) = 2
bytArr(2) = 253

MsgBox ConvertByteToHex(bytArr(0))
MsgBox ConvertByteToHex(bytArr(1))
MsgBox ConvertByteToHex(bytArr(2))

End Sub
Public Function ConvertByteToHex(b As Byte)
  If Len(VBA.hex(b)) = 1 Then
     ConvertByteToHex = "0" & VBA.hex(b)
  Else
      ConvertByteToHex = VBA.hex(b)
End If
End Function
Bonjour Scraper,

Il semblerait que ça colle bien à ce que je veux, à un problème près : il semblerait que je ne stocke pas des bytes uniques, mais des arrays de bytes dans un array.
En l'occurrence, j'ai un array nommé arr. arr(0) ce sont mes id, et arr(1) ce sont des array de bytes (voir premier screenshot du premier post). Comment puis-je boucler sur ces array des bytes ?

Bonne journée,
 

xUpsilon

XLDnaute Accro
Si tu veux simplement transformer un Array de Bytes en String, c'est à dire juxtaposer les Bytes dans une chaine ça me parait hyper simple.
VB:
For i = LBound(ArrayOfBytes) To UBound(ArrayOfBytes)
    Str = Str & ArrayOfBytes(i)
Next i
Mais ça ne doit pas être la réponse que tu attends !
Re Dudu,

Justement, si tu regardes dans mon premier screenshot du premier post, c'est ce que j'essaye de faire : dans arr(0) j'ai des id, et dans arr(1) j'ai des array de bytes. Du coup une fois dans ma boucle, j'essaye de pousser mes array de bytes dans un temp, de manière à avoir un temp qui soit un array à proprement parler (voir la ligne for n = LBound(temp) to UBound(temp)).

Mais en essayant comme ça, j'ai une erreur de type :
1700749535439.png


Est-ce qu'un array de bytes ne serait pas un array ? Ou est-ce que l'illustration qui m'est donnée par mes variables locales (voir post #1) est trompeuse, et que ce n'est en fait pas un array de bytes, mais un autre type de données ?

Bonne journée,
 

xUpsilon

XLDnaute Accro
Re,

Erratum : visiblement si, il s'agissait bien d'un array, et j'arrive maintenant à boucler dessus. Je pense que je devais avoir une déclaration de variable du mauvais type qui venait intercepter et mettre le bazar dans la situation, je dois dire que je ne comprends toujours pas tout à fait comment ça fonctionne à présent.

Merci beaucoup pour votre temps et désolé pour la confusion,
 

Katido

XLDnaute Occasionnel
Tout d'abord je n'ai pas d'espion (j'espère !!!)

Et peu importe que le nombre soit en décimal, hexa, binaire ou autre, ça reste un nombre et ce n'est pas une chaine. Mais un nombre peut aussi être associé à un caractère (par la table ASCII par exemple)

Et dans ton cas, il faut passer en caractères car ta chaine est une chaine de caractères.
 

xUpsilon

XLDnaute Accro
Tout d'abord je n'ai pas d'espion (j'espère !!!)

Et peu importe que le nombre soit en décimal, hexa, binaire ou autre, ça reste un nombre et ce n'est pas une chaine. Mais un nombre peut aussi être associé à un caractère (par la table ASCII par exemple)

Et dans ton cas, il faut passer en caractères car ta chaine est une chaine de caractères.
Bonjour,

Dans mon cas, j'ai une suite de bytes qui mis bout à bout représentent une série de valeurs (d'abord des sections, puis des coordonnées x/y de positions de points) en LittleIndian.
Du coup je veux récupérer la valeur des bytes en tant que string pour pouvoir les manipuler et les intervertir, puis recalculer cette valeur Hexa pour en déduire sa valeur décimale.

Concrètement, j'ai un array de bytes B0, B1, B2, B3, ... B20001.
Ensuite je les traduis en string S0, S1, S2, S3, ... S20001.
Ensuite je les intervertis pour remettre mon Little Indian dans le bon ordre et je les stocke dans un string S1&S0, S3&S2, S5&S4, ..., S20001&S20000.
Enfin je repasse ces valeurs en Hexa 0x(S1&S0), 0x(S3&S2), ...
Ensuite je les traduis en décimal pour retrouver mes dimension D0, D1, D2, ... , D10000

Ici, si je prends mes deux premiers bytes, j'ai 5E02 -> 025E -> 606

En plus de ça, il y a une autre subtilité : j'ai plus loin dans mon télégramme des valeurs qui ne sont pas sur 2 bytes mais sur 1 seul, et certains couples de valeurs qui ne sont pas à traiter en LittleIndian mais bien 1 par 1, avec l'élément suivant qui conditionne le précédent (par ex, si byte 1001=0, alors byte 1000= HEX2DEC(Byte 1000)-255

Bonne journée,
 

Discussions similaires

Réponses
11
Affichages
1 K

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin