[VB.NET] BYTE ARRAY TO STRING [Résolu]

bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 5 juin 2008 à 16:08 - Dernière réponse : bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention
- 6 juin 2008 à 11:29
Salut,

Je souhaite convertir un tableau de Byte vers en String.

J'avais commencé par écrire :

Dim sTChar
As
String = vbNullString

For i
As
Integer = 0
To UBound(ArrBFile)   sTChar += Chr(ArrBFile(i))

Next i
Ce code fonctionne très bien mais devient vite très très lent avec de grands tableaux.

Après quelques recherches j'ai lu que l'on pouvait utiliser la class System.Text.Encoding

Après plusieurs essais (UTF7, ASCII, Unicode...), j'ai obtenu le meilleur résultat avec :

Dim

sTChar
As
String = System.Text.Encoding.UTF7.GetString(ArrBFile)
Le problème est que sTChar ressort avec la bonne longueur (celle du tableau) mais seuls les 4 premiers caractères sont remplis. Les autres sont vides (espaces ??).

Il est important pour moi d'obtenir exactement le même résultat qu'avec la boucle et la fonction Chr

Avez-vous une idée ou un alternative ?

Merci d'avance

Bonne prog
++
Afficher la suite 

15 réponses

Répondre au sujet
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 6 juin 2008 à 11:29
+3
Utile
J'ai enfin trouvé, je m'obstinait à chercher le bon encodeur alors qu'il ne faut simplement pas encoder.

Il fallait donc utiliser l'instruction suivante  :

System.Text.Encoding.Default.GetString(ArrBFile)

Bonne prog
++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bouv
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 5 juin 2008 à 16:24
0
Utile
Bonjour

Ton ArrayBFile, il ne contient pas un caractère null (CHR(0)) ?

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Commenter la réponse de NHenry
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 5 juin 2008 à 16:32
0
Utile
Salut,

Merci de te pencher sur la question.

Si effectivement en 5ème position [ ArrayBFile(4) = Chr(0) ] et un peu plus loin dans le tableau également.

Que se passe-t-il exactement ? Comment résoudre ce problème ?

Bonne prog
++
Commenter la réponse de bouv
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 5 juin 2008 à 16:45
0
Utile
Bonjour

Il considère que la valeur 0 est un null terminal, donc il arrête la conversion, c'est une réaction normale.

La seule solution est de supprimer ces null avant de convertir le tableau.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Commenter la réponse de NHenry
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 5 juin 2008 à 16:53
0
Utile
Ok je comprend, merci pour le renseignement.

Sinon as tu une piste pour supprimer tous ces null de manière efficace ?
car si je passe par une boucle je crains que niveau performance cela ne soit 0 pointé.

Bonne prog
++
Commenter la réponse de bouv
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 5 juin 2008 à 17:04
0
Utile
Bonjour

En .NET 2+

Dim lLst as new list(of byte)
lLst.addrange(ArrayBFile)

do while lLst.Contains(0)
    llst.Remove(0)
loop

........GetString(lLst.ToArray)

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Commenter la réponse de NHenry
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 5 juin 2008 à 17:46
0
Utile
Re-salut,

Sur la ligne : Dim lLst as new list(of byte)

J'ai une erreur Type 'Liste' non défini

Dois-je faire un Imports ?

Pour info, je suis en VB 2008 Express.

Bonne prog
++
Commenter la réponse de bouv
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 5 juin 2008 à 18:35
0
Utile
Bouv> Salut,
Ne change rien à ta conversion (enfin si utilise .ASCII) quand meme.
Ce n'est pas parce que tu ne vois pas tous les caractéres de sTchar, qu'ils n'y sont pas.
Il te suffit de faire apres ton .Getstring un  Stchar=stchar.replace(chr(0),"?") ou ce que tu veux pour remplacer les [0]
@+
Megafan
Commenter la réponse de cs_Megafan
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 5 juin 2008 à 19:01
0
Utile
Megafan>> Salut, avec .ASCII ma chaine ne commence pas de la même manière qu'avec la boucle et la fonction Chr.

Avec .UTF7 en revanche la chaine commence bien mais s'arrete au 4ème caractere.

Qu'apporte .ASCII par rapport à .UTF ?

Sinon replace je veux bien mais par quoi ?

Mon objectif est vraiment d'obtenir EXACTEMENT le même résultat qu'avec la boucle et la fonction Chr.

Merci à vous deux pour votre aide.

Bonne prog
++
Commenter la réponse de bouv
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 5 juin 2008 à 20:45
0
Utile
Salut,

Le souci est que dans ton tableau tu as des bytes à 0, or  il est impossible d'afficher une chaine qui contient un 0, l'affichage de la chaine s'arrete à ce caractére.
Donc, utilise la fonction replace pour remplacer les bytes à 0 par un caractére 'affichable', un espace, un point ce que tu veux....

UTF7<---> ASCII
Je pense qu'il a d'autres caractéres non affichable dans ton tableau (bytes de 0 à 31) et il faut donc aussi que tu les
remplacent tous par un caractére affichable.

Voila j'espere que ca ira maintenant
@+
Megafan
Commenter la réponse de cs_Megafan
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 6 juin 2008 à 00:10
0
Utile
Salut,

Je ne pense pas que cela soit une bonne idée. L'objectif n'est pas d'afficher la chaine mais qu'elle ai un contenu le plus fidèle possible à mon tableau de byte (qui lui contient une image JPG).

Cela dit j'ai une autre idée. Sachant que je remplit mon tableau de Byte depuis un MemoryStream (MyStream.ToArray)

Est-il possible, dans un deuxième temps d'obtenir cette chaine depuis le MemoryStream ?

Bonne prog
++
Commenter la réponse de bouv
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 6 juin 2008 à 09:00
0
Utile
Salut,
si ce n'est pas pour l'afficher.... pourqoui ne garde tu pas ton tableau de byte ??????????????????
il faudrait m'expliquer la ?
@+
Megafan
Commenter la réponse de cs_Megafan
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 6 juin 2008 à 09:43
0
Utile
Pour ma class de génération de PDF

Pour ajouter une image dans un PDF (JPG seulement), j'ai besoins de cette chaine.
 
Le fichier est entièrement construit à partir de la commande PrintLine.

Or, cette chaine doit se trouver au milieu d'un certain nombre de balises, au format String elles aussi.

Bonne prog
++
Commenter la réponse de bouv
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 6 juin 2008 à 10:52
0
Utile
Bonjour

Je pense que c'est plutot un codage de base 64 qui est utilisé, mais bon, je ne garantit rien.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Commenter la réponse de NHenry
bouv 1424 Messages postés mercredi 6 août 2003Date d'inscription 29 juin 2011 Dernière intervention - 6 juin 2008 à 11:29
0
Utile
Merci quand même pour votre aide

Bonne prog
++
Commenter la réponse de bouv

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.