Transformamos bytes en cadenas y viceversa: la magia del código hexadecimal en C#
\n\n¿Alguna vez te has preguntado cómo ve una computadora una imagen, música o simplemente un archivo de texto? Todo es solo una secuencia de bytes. Pero los bytes no son muy convenientes para mostrar al usuario o transmitir en una URL. Aquí es donde la cadena hexadecimal (hex string) viene al rescate: una representación compacta y legible de datos binarios.
\n\nImagina: estás escribiendo un módulo criptográfico, trabajando con hashes, transmitiendo datos binarios a través de JSON o registrando el contenido de un paquete. Y de repente, ¡pum! Necesitas convertir un array de bytes en una cadena comprensible. O viceversa, restaurar los bytes originales a partir de una cadena hex. ¿Te suena familiar? Esta pregunta es una de las más populares en Stack Overflow, y hoy la resolveremos de una vez por todas. Bienvenido a pythonlib.ru — tu guía en el mundo de la programación.
\n\n¿Por qué convertir un byte array a una cadena hex?
\n\nVamos al grano. Un array de bytes (byte[]) son datos sin procesar: números del 0 al 255. Son difíciles de leer para una persona y, en algunos protocolos de texto (HTTP, JSON), incluso pueden romper el formato. La cadena hex resuelve ambos problemas:
\n\n- \n
- Compacidad: un byte se convierte en dos caracteres (por ejemplo, 255 → "FF"). \n
- Seguridad: la cadena solo contiene caracteres seguros (0-9, A-F). \n
- Comodidad: las cadenas hex son fáciles de copiar, comparar y registrar. \n
Seguramente has visto estas cadenas en hashes MD5, SHA256 o en tokens de autorización. Ahora sabes cómo funciona "bajo el capó".
\n\nMétodo n.º 1: El clásico — BitConverter (simple y rápido)
\n\nLa forma más popular en C# es usar la clase incorporada BitConverter. Está disponible en .NET desde la primera versión y funciona sin complicaciones.
Conversión byte[] → cadena hex
\n\nbyte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = BitConverter.ToString(data);\nConsole.WriteLine(hexString); // Salida: 0F-1A-FF-00\n\nMuy simple, ¿verdad? Pero hay un detalle: se inserta un guion entre los pares de caracteres. Si el guion te molesta, es fácil eliminarlo:
\n\nstring hexString = BitConverter.ToString(data).Replace("-", "");\nConsole.WriteLine(hexString); // Salida: 0F1AFF00\n\nVentajas: mínimo código, método incorporado, fácil para principiantes.
\nDesventajas: guion adicional (hay que eliminarlo), pequeña asignación de memoria para cadenas intermedias.
Conversión inversa: cadena hex → byte[]
\n\nCon la operación inversa es un poco más complicado. BitConverter solo funciona en una dirección. Pero no nos rendimos: escribamos un analizador simple:
\n\npublic static byte[] HexStringToBytes(string hex)\n{\n // Eliminamos posibles guiones y espacios\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// Uso:\nstring hex = "0F1AFF00";\nbyte[] result = HexStringToBytes(hex);\n// result: { 0x0F, 0x1A, 0xFF, 0x00 }\n\nEste método usa Convert.ToByte con base 16: confiable y legible. Pero para arrays grandes, Substring crea muchas cadenas temporales. Para código de producción, es mejor usar Span<T> o un bucle con indexación de caracteres.
Método n.º 2: Moderno — Convert.ToHexString (.NET 5+)
\n\nA partir de .NET 5, Microsoft agregó el tan esperado método Convert.ToHexString. Funciona rápido y sin guiones.
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = Convert.ToHexString(data);\nConsole.WriteLine(hexString); // Salida: 0F1AFF00\n\n¡Hermoso! Sin guiones, sin Replace. Y para la operación inversa está Co