Transformer les octets en chaînes et vice versa : la magie du code hexadécimal en C#
\n\nAvez-vous déjà réfléchi à la façon dont un ordinateur voit une image, de la musique ou simplement un fichier texte ? Tout cela n'est qu'une séquence d'octets. Mais les octets ne sont pas très pratiques à afficher pour un utilisateur ou à transmettre dans une URL. C'est là qu'intervient la chaîne hexadécimale (hex string) — une représentation compacte et lisible des données binaires.
\n\nImaginez : vous écrivez un module cryptographique, vous travaillez avec des hachages, vous transmettez des données binaires via JSON ou vous journalisez le contenu d'un paquet. Et là, soudain ! vous devez transformer un tableau d'octets en une chaîne compréhensible. Ou inversement, restaurer les octets d'origine à partir d'une chaîne hexadécimale. Cela vous semble familier ? Cette question est l'une des plus populaires sur Stack Overflow, et aujourd'hui nous allons l'analyser une fois pour toutes. Bienvenue sur pythonlib.ru — votre guide dans le monde de la programmation.
\n\nPourquoi convertir un byte array en chaîne hexadécimale ?
\n\nAllons droit au but. Un tableau d'octets (byte[]) est une donnée brute : des nombres de 0 à 255. Ils sont difficiles à lire pour un humain, et dans certains protocoles textuels (HTTP, JSON), ils peuvent même casser le format. La chaîne hexadécimale résout les deux problèmes :
\n\n- \n
- Compacité : un octet se transforme en deux caractères (par exemple, 255 → "FF"). \n
- Sécurité : seuls des caractères sûrs restent dans la chaîne (0-9, A-F). \n
- Pratique : les chaînes hexadécimales sont faciles à copier, comparer et journaliser. \n
Vous avez sûrement vu de telles chaînes dans les hachages MD5, SHA256 ou dans les jetons d'autorisation. Maintenant, vous savez comment cela fonctionne « sous le capot ».
\n\nMéthode n°1 : La classique — BitConverter (simple et rapide)
\n\nLa façon la plus populaire en C# est d'utiliser la classe intégrée BitConverter. Elle existe dans .NET depuis la toute première version et fonctionne sans complications inutiles.
Conversion byte[] → chaîne hexadécimale
\n\nbyte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = BitConverter.ToString(data);\nConsole.WriteLine(hexString); // Sortie : 0F-1A-FF-00\n\nTout est simple, n'est-ce pas ? Mais il y a un détail : un tiret est inséré entre les paires de caractères. Si le tiret vous gêne, il est facile de l'enlever :
\n\nstring hexString = BitConverter.ToString(data).Replace("-", "");\nConsole.WriteLine(hexString); // Sortie : 0F1AFF00\n\nAvantages : code minimal, méthode intégrée, compréhensible pour les débutants.
\nInconvénients : tiret superflu (à supprimer), légère allocation mémoire pour les chaînes intermédiaires.
Conversion inverse : chaîne hexadécimale → byte[]
\n\nPour l'opération inverse, c'est un peu plus compliqué. BitConverter ne fonctionne que dans un sens. Mais nous n'abandonnons pas — écrivons un analyseur simple :
\n\npublic static byte[] HexStringToBytes(string hex)\n{\n // Supprimer les éventuels tirets et espaces\n hex = hex.Replace("-", "").Replace(" ", "");\n int length = hex.Length;\n byte[] bytes = new byte[length / 2];\n for (int i = 0; i < length; i += 2)\n {\n bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);\n }\n return bytes;\n}\n\n// Utilisation :\nstring hex = "0F1AFF00";\nbyte[] result = HexStringToBytes(hex);\n// result : { 0x0F, 0x1A, 0xFF, 0x00 }\n\nCette méthode utilise Convert.ToByte avec la base 16 — fiable et lisible. Mais pour les grands tableaux, Substring crée beaucoup de chaînes temporaires. Pour le code de production, il est préférable d'utiliser Span<T> ou une boucle avec indexation des caractères.
Méthode n°2 : Moderne — Convert.ToHexString (.NET 5+)
\n\nDepuis .NET 5, Microsoft a ajouté la méthode tant attendue Convert.ToHexString. Elle fonctionne rapidement et sans tirets.
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = Convert.ToHexString(data);\nConsole.WriteLine(hexString); // Sortie : 0F1AFF00\n\nMagnifique ! Pas de tirets, pas de Replace. Et pour l'opération inverse, il y a Co