Conversion de byte[]

Signaler
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006
-
nicolaslepot
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006
-
Bonjour les amis,

en C#, il y a bien un objet qui permet de
faire l'inversse de BitConverter...
Mais j'arrive pas à le retrouver.

byte[] bitEncoded = ...
...
...
string strEncoded =
BitConverter.ToString(bitEncoded);
...
...
byte[] bitEncoded2 =
???????

Donc une fois que j'ai strEncoded, je voudrais le re-convertir
pour de nouveau retrouver la même chose que bitEncoded en byteArray.

Merci d'avance,

Nico

9 réponses

Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Convert.FromBase64String(); ?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
tu peux tout simplement utiliser :

Pour encoder une chaine en byte[] :

string maString = "ceci est un test !";
byte[] b = Encoding.Default.GetBytes( maString );

pour décoder :
string ret = Encoding.Default.GetString( b );

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Coucou,

merci pour vos réponses.

Modib :

> je viens d'essayer, mais j'ai une exeption : "caratère non valide dans une chaine base64".

> Je crois que

Convert.FromBase64String(); est le contraire de Convert.ToBase64String(); car elle fonctionne bien l'une avec l'autre. Elle génère une chaine de caractères quelconques. Exemple :

Encrypted b64 (len=208) : AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAI1GmATuLGUWwqlcrxSrtgw
AAAAACAAAAAAADZgAAqAAAABAAAACV5Ot2zre7+2LmXTTqB++cAAAAAASAAACgAAAAEAAAAFU1gcVMse
sW7UWj7or2CcwQAAAAouRDE2E3fdlqQ5NWDOqe6hQAAACG2ygPQeZa+FjsYTZql7WfNBX0Sg==

> BitConverter.ToString(bitEncoded); génère une chaine de caractères qui représente de l'hexadécimal dirait-on. Exemple :

Encrypted bitconvert (len=461) : 01-00-00-00-D0-8C-9D-DF-01-15-D1-11-8
C-7A-00-C0-4F-C2-97-EB-01-00-00-00-23-51-A6-01-3B-8B-19-45-B0-AA-57-2B-C5-2A-ED-
83-00-00-00-00-02-00-00-00-00-00-03-66-00-00-A8-00-00-00-10-00-00-00-95-E4-EB-76
-CE-B7-BB-FB-62-E6-5D-34-EA-07-EF-9C-00-00-00-00-04-80-00-00-A0-00-00-00-10-00-0
0-00-55-35-81-C5-4C-B1-EB-16-ED-45-A3-EE-8A-F6-09-CC-10-00-00-00-A2-E4-43-13-61-
37-7D-D9-6A-43-93-56-0C-EA-9E-EA-14-00-00-00-86-DB-28-0F-41-E6-5A-F8-58-EC-61-36
-6A-97-B5-9F-34-15-F4-4A

sebmafate :

> J'aimerais bien pouvoir utiliser ta méthode qui m'a l'air bien plus abordable, mais je suis obligé d'utiliser BitConverter.ToString() car un autre programme sur lequel je tente de m'aligner pour ajouter des possibilités utilise cette technique pour coder des chaînes dans un texte. L'ancien programme et le mien (le nouveau) devront pouvoir tous les deux travailler avec ces fichiers.

> Justement avec Encoding.??? est-ce que je ne pourrais pas y arriver ?

Merci encore pour votre intérêt,

nico
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Pour avoir une idée de ce que contient le tableau de bit, je viens de faire ceci

Console.Write("Encrypted bit (len={0}) : ", bitEncoded.Length);
for (int i = 0; i < bitEncoded.Length; i++)
                Console.Write("{0}", bitEncoded[i].ToString() );

qui me donne pour résultat :

Encrypted bit (len=154) : 100020814015722312120917140122019279194151235100035811
66159139256917617087431974223713100002000003102001680001600019032157168159242231
71266323111223273252360000412800160000160001571261242511372391361037914419813581
22718756160006123821614020526015721122821217615021367200200001689210815883209481
163810133245214233152341524468179

> En cherchant le rapport avec ce qu'a fait la méthode BitConverter.ToString(), à savoir :

Encrypted bitconvert (len=461) : 01-00-00-00-D0-8C-9D-DF-01-15-D1-11-8
C-7A-00-C0-4F-C2-97-EB-01-00-00-00-23-51-A6-01-3B-8B-19-45-B0-AA-57-2B-C5-2A-ED-
83-00-00-00-00-02-00-00-00-00-00-03-66-00-00-A8-00-00-00-10-00-00-00-95-E4-EB-76
-CE-B7-BB-FB-62-E6-5D-34-EA-07-EF-9C-00-00-00-00-04-80-00-00-A0-00-00-00-10-00-0
0-00-55-35-81-C5-4C-B1-EB-16-ED-45-A3-EE-8A-F6-09-CC-10-00-00-00-A2-E4-43-13-61-
37-7D-D9-6A-43-93-56-0C-EA-9E-EA-14-00-00-00-86-DB-28-0F-41-E6-5A-F8-58-EC-61-36
-6A-97-B5-9F-34-15-F4-4A

Je constate ceci :
>   1   0      0    0     208    140   157   ...
>  01-00 - 00-00 -   D0  -  8C -  9D -...

on dirait une simple converssion du décimale vers l'hexadécimal.
seulement, je vois pas trop bien pq une fois ca se fait sur 1digit décimal et après sur 2 digit....

Je sais qu'il y a un truc avec Windows qui inverse les chiffres hexa je crois. C'est la différence avec bigEndian et litleedian non ?
si qq1 connait la règle et peut me la donner, il y a peut être moyen de frabiquer une méthode pour faire ce que je veux...

nico
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Voilà j'ai fait des recherches,

byte[] bitEncoded = ...
...
...
string strEncoded = BitConverter.ToString(bitEncoded);
...
...
byte[] bitEncoded2 = ???????

Je pense que strEncoded contient la représentation hexadécimale de la converssion de bitEncoded en UTF-x où x est une des versions de UTF.
> UTF code en effet certait caractère sur 1, 2 ou 3 octets suivant les cas...

> Mais alors maintenant pour reconverir...
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006

j'ai trouvé le rapport...

il faut lire la chaine hexa par deux chiffres, et convertir ces 2 chiffres en décimal.
Ce que je cherche à opbtenir n'est que la suite déciamale traduite de la chaine hexa.

 1  0  0  0 208 140 157 223   1  21 209  17 140 122  0 192  79 194 151 235  1  0  0  0 35 81
01-00-00-00- D0- 8C- 9D- DF- 01 -15- D1- 11- 8C- 7A-00- C0- 4F- C2- 97- EB-01-00-00-00-23-51

Voilou, alors plutôt que de me prendre la t^te j'ai pensé faire ma propre petite méthode. Mais là encore j'ai un os :

byte[] bitDecoded = new byte[strDecoded.Length / 2];            for (int i 0, b 0; i < strDecoded.Length - 1; i++)
            {
                Console.WriteLine("- - - - - - - - -");
                string nbHex = "" + strDecoded[i] + strDecoded[i + 1];
                int nbDec = int.Parse(nbHex, System.Globalization.NumberStyles.HexNumber);
                for (int j = 0; j < nbDec.ToString().Length; j++, b++)
                    bitDecoded[b] = nbDec.ToString()[j];
            }

à la dernière ligne nbDec.toString()[j]; contient le premier caratère du chiffre décimale à insérer dans le tableau de byte. Evidement, le compilateur ne veut pas car il n'y a pas de conversion implicite de String vers Byte.

Comment je peux juste créer un byte qui à pour valeur le chiffre (sur 1 seul digit) qui se trouve dans un string ?

Merci d'avance (je me rends bien compte que le sujet est pénible),

nico
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
44
Euh, byte.TryParse() ???

<hr size="2" />-Blog-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
Salut,

// Le Tableau de départ.
byte[ ] tab1 = { 76, 117, 116, 105, 110, 111, 114, 101 };


// Transforme le tableau en chaine via BitConverter.
string str = BitConverter.ToString( tab1 );


// Affiche la chaine
Console.WriteLine( "Contenu de la chaine :\r\n" + str );


// On vire les tirets de la chaine.
string[ ] split = str.Split( '-' );


// Créer un nouveau tableau.
byte[ ] tab2 = new byte[ tab1.Length ];


// Parse les chaines hexa en byte.
for ( int i = 0; i < tab2.Length; i++ )
    tab2[ i ] = byte.Parse( split[ i ], NumberStyles.HexNumber ); // ou TryParse.


// Affiche le tableau en hexa.
Console.WriteLine( "\r\nContenu du tableau en hexa :" );


    foreach( byte b in tab2 )
        Console.Write( "{0:X} ", b );


// Pause.
Console.ReadLine( );
Messages postés
23
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Coucou,

un tout grand merci les gars : le byte.Parse();

génial :)