coyotejanin
Messages postés5Date d'inscriptionjeudi 16 novembre 2000StatutMembreDernière intervention30 octobre 2009
-
24 juin 2008 à 21:23
coyotejanin
Messages postés5Date d'inscriptionjeudi 16 novembre 2000StatutMembreDernière intervention30 octobre 2009
-
25 juin 2008 à 12:30
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!
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 24 juin 2008 à 23:25
"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)).
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 24 juin 2008 à 22:07
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).
coyotejanin
Messages postés5Date d'inscriptionjeudi 16 novembre 2000StatutMembreDernière intervention30 octobre 2009 24 juin 2008 à 22:28
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 =)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 24 juin 2008 à 22:58
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
coyotejanin
Messages postés5Date d'inscriptionjeudi 16 novembre 2000StatutMembreDernière intervention30 octobre 2009 24 juin 2008 à 23:15
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