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

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

15 réponses

Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
Salut,
si ce n'est pas pour l'afficher.... pourqoui ne garde tu pas ton tableau de byte ??????????????????
il faudrait m'expliquer la ?
@+
Megafan
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
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
++
Messages postés
14675
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 juillet 2020
143
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
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Merci quand même pour votre aide

Bonne prog
++