Aide - Recuperation d'une partie de byte dans une variable [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
30 octobre 2009
-
Messages postés
5
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
30 octobre 2009
-
Bonjour a tous et a toutes!

J'explique mon probleme :
Cela fait quelques jours que je suis a la recherche d'une commande ou d'une methode me permetant de recuperer un certain nombre de bytes ce trouvant dans un variable de type byte!

J'ai changer ma variable de type Byte en String ( Encoding.ASCII.GetBytes )   , puis j'ai recuperé la partie qui m'interesser a l'aide de la commande "SubString" mais au retour en type byte ( Encoding.ASCII.GetString ), je n'ai plus les même bytes qu'avant!

Je pence avoir un probleme au niveau de la conversion entre les 2 types de variables.
C'est pour cela que j'aimerais obtenir une methode plus direct que mon bricolage pas trés fiable!

Je vous en remercie d'avance

HIPOPOTAMUS

6 réponses

Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
8
"Pour l'histoire de "Encoding.ASCII.GetBytes", c'etait tout simplement une erreur de frape de ma part."

Je m'en doutais
"Je tien a présiser que Moi et les Bytes/Bits sa fait deux! ( Au
passage, si vous avait un cours sur les bits/Bytes, je suis preneur )"
Dans le monde du numérique, l'unité de base est souvent le Byte (également nommé octet en français). Il est composé de 8 bits, qui chacuns peuvent prendre la valeur 0 ou 1. Ceux ci vont définir une valleur allant de 0 à 255 à l'octet.
Exemples (binaire / décimal):
00000000 = 0
00000001 = 1
00000010 = 2
00000011 = 3
01001100 = 76
11111111 = 255

Pour un codage de texte sur 8 bits, chaque caractère sera donc représenté par un octet. Pour une image en 24 bits, chaque pixel prendra 3 octets (24/8)

"Je travail avec des sockets"
Dans la plupart des cas: oublie les sockets en VB.NET. C'est l'objet le plus basique pour faire des envois/réceptions sur Internet, essaie plutot un TcpClient, ou peut être même un WebClient, ta tâche sera grandement facilité.
"Mon code consiste a ouvrir un fichier ( Image ) puis le recuperer en bytes"
Si tu as le fichier de ton image:
        Dim file() As Byte = IO.File.ReadAllBytes("Fichier.jpg")

Si tu n'as que l'image déjà ouverte, c'est un peu plus compliqué, car tu n'a plus le format original de l'image mais que sa version décompressé. Donc à ce moment là, en gros tu envoie la version décompressé ainsi que des info sur son format pour que le réceptionneur puisse réenregistrer l'image en fichier (attention, il y aura de la perte de qualité, par ex pour une décompression/recompression en jpg). Tu peux aussi utliser une compression pour accélérer le transfert, mais encore une fois attention à la perte de qualité.
Voici pour récupérer les donnée d'une image déjà ouverte (et donc décompressé):

        Dim s As New IO.MemoryStream
        img.Save(s, Drawing.Imaging.ImageFormat.Jpeg)
        Dim datas(s.Length - 1) As Byte
        s.Read(datas, 0, s.Length)

Au lieu de passer par un MemoryStream puis un tableau de Byte, tu peux aussi directement écrire l'image dans le stream de ta connexion TCP.

Dans les 2 cas tu dois envoyer le nom et format du fichier avec les données de l'image.
"Par la suite, j'aimerais le decouper en plusieurs parties puis les envoyer les unes aprés les autres!"
Ca tu le fais lors de l'envoie, un truc du genre:

        Dim datas(s.Length - 1) As Byte      ' Les données à envoyer
        Dim Client As New Net.Sockets.TcpClient  ' La connexion internet
        Dim NetStream As Net.Sockets.NetworkStream = Client.GetStream   ' Le stream utlisé pour envoyer des données par la connexion
        For i As Integer = 0 To datas.Length - 1 Step Client.SendBufferSize
            NetStream.Write(datas, i, Client.SendBufferSize)
        Next

En tout cas, ne convertir pas ton image en chaine de caractère. Pour travailler avec des bytes, utilise des Stream avec un BinaryReader et BinaryWriter (tu peux voir le StreamReader et StreamWriter aussi). Ou sinon, pour prendre un "bout" de l'image, tu n'as qu'a faire une copie de certaines cases de ton tableau (dans une boucle tab1(i) = tab2(i)).
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
8
Salut,
Pas très clair ton histoire:
"recuperer un certain nombre de bytes ce trouvant dans un variable de type byte!"
Dans un byte, il n'y a pas plusieurs bytes. Tu parle peut-être de bits? (1 byte = 8 bits)
"J'ai changer ma variable de type Byte en String ( Encoding.ASCII.GetBytes )"
Plutôt Encoding.ASCII.GetString pour passer d'un tableau de bytes à une chaine de caractères, et vice-versa. Si tu parlais de bits précédement, alors cette fonction n'a rien à voir avec ce que tu veux faire, car elle ne fait que de convertir un String (ou un Char) en tableau de bytes, et vice-versa.... voir l'exemple ci-dessous...
"puis j'ai recuperé la partie qui m'interesser a l'aide de la commande "SubString""
Donc si par exemple t'as un byte ayant la valeur 106, tu convertis en String, ça te donne un "j". Mais attention, comme tu peux le voir sur la table de conversion (lien ci-dessous), pas toutes les valeurs d'un byte donnent un caractère pouvant être affiché, et c'est pourquoi ta conversion Bytes => String => Bytes ne fonctionne pas comme tu le voudrais (il y a une perte de donnée lors de la conversion Bytes => String).

Table de conversion ASCII

Et si tu nous réexpliquais plus clairement ce que tu veux faire?
Messages postés
5
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
30 octobre 2009

Je te trouve plutot fort ^^! Tu m'a presque compris

Pour l'histoire de "Encoding.ASCII.GetBytes", c'etait tout simplement une erreur de frape de ma part. Je m'en excuse.

Je tien a présiser que Moi et les Bytes/Bits sa fait deux! ( Au passage, si vous avait un cours sur les bits/Bytes, je suis preneur )

Je travail avec des sockets, ( qui eux aussi sont une plait pour moi! Je travailler avec le winsock sur VB6.0, mais avec le 2008, je suis obliger de bidouiller :S ce n'est plus aussi simple. ), c'est pour cela que j'ai besoin des d'utiliser des Bytes.

Mon bidouillage est assez compliquer! Il y a surment plus simple, mais n'etant pas autant allaise en VB2008 qu'en VB6.0, je suis obliger de bidouiller mes codes qui ne marche que rarement! ( Je ne trouve souvent pas mes renseignement sur internet ).

Mon code consiste a ouvrir un fichier ( Image ) puis le recuperer en bytes. Par la suite, j'aimerais le decouper en plusieurs parties puis les envoyer les unes aprés les autres!

C'est pour cela que j'ai besoin de prendre la premiere partie de la variable, de l'envoyer, puis la dexieme partie et l'envoyer ect ect ect ...

Si tu as une solution plus facile, fait me la parvenir STP =) . Si tu possede un cours sur les sockets, je suis preneur aussi =)

Merci d'avance pour ta reponce!

HIPOPOTAMUS
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
Kevin : Tu es en bonne place pour remporter le trophée de "Boule de cristal 2008" !!
CoyoteTruc : Sais-tu qu'un Byte définit un caractère (numériquement par son code Ascii) ? et qu'une suite de Bytes forme une String (BSTR) ?
A partir de là, manipulation sur un tableau de Bytes ou un découpage de String, ce n'est que la méthode qui change.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
30 octobre 2009

Oui, tout cela je l'avait compris. C'est pour cela que je chercher a decouper decouper un String! Mais etant donné que certains bytes n'ont pas d'equivalance en String, cela me pausait probleme!

Je chercher justement une methode pour couper les bytes et non pas les String.

Si vous connaissez une methode, merci de bien vouloir me la faire connaitre =D

Merci d'avance

HIPOPOTAMUS
Messages postés
5
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
30 octobre 2009

Merci pour toutes ces reponces! Je pence que mon code est du grand n'importe quoi...
J'utilise la comande "My.Computer.FileSystem.WriteAllBytes"...

Je pence que je vais m'interesser au TcpClient ou WebClient, mais je n'y connais rien ^^!

Je vais refaire mon programme entierement aussi ^^

En tout cas, merci pour votre aide et à la prochaine!

HIPOPOTAMUS