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

Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
- - Dernière réponse : bouv
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
- 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 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
3
Merci
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
++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 154 internautes nous ont dit merci ce mois-ci

Commenter la réponse de bouv
Messages postés
14455
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 mai 2019
130
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
14455
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 mai 2019
130
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
14455
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 mai 2019
130
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
390
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
390
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
390
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
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
Messages postés
14455
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 mai 2019
130
0
Merci
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
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
0
Merci
Merci quand même pour votre aide

Bonne prog
++
Commenter la réponse de bouv