Conversión de cadena a matriz de bytes en C #

Soy bastante nuevo en C #. Estoy convirtiendo algo de VB en C #. Tener un problema con la syntax de esta statement:

if ((searchResult.Properties["user"].Count > 0)) { profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]); } 

Luego veo los siguientes errores:

Argumento 1: no se puede convertir de ‘objeto’ a ‘byte []’

La mejor coincidencia de método sobrecargado para ‘System.Text.Encoding.GetString (byte [])’ tiene algunos argumentos no válidos

Traté de corregir el código basado en esta publicación, pero todavía no tuve éxito

 string User = Encoding.UTF8.GetString("user", 0); 

¿Alguna sugerencia?

Si ya tiene una matriz de bytes, necesitará saber qué tipo de encoding se utilizó para convertirla en una matriz de bytes.

Por ejemplo, si la matriz de bytes se creó de esta manera:

 byte[] bytes = Encoding.UTF8.GetBytes(someString); 

Tendrá que volver a convertirlo en una cadena como esta:

 string someString = Encoding.UTF8.GetString(bytes); 

Si puede encontrar en el código que heredó, la encoding utilizada para crear la matriz de bytes, entonces debe establecerse.

En primer lugar, agregue el System.Text nombres System.Text

 using System.Text; 

Entonces usa este código

 string input = "some text"; byte[] array = Encoding.ASCII.GetBytes(input); 

Espero arreglarlo!

También puede usar un Método de extensión para agregar un método al tipo de string siguiente manera:

 static class Helper { public static byte[] ToByteArray(this string str) { return System.Text.Encoding.ASCII.GetBytes(str); } } 

Y úsalo como a continuación:

 string foo = "bla bla"; byte[] result = foo.ToByteArray(); 
 static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } 

utilizar esta

 byte[] myByte= System.Text.ASCIIEncoding.Default.GetBytes(myString); 

El siguiente enfoque funcionará solo si los caracteres son de 1 byte. (Unicode predeterminado no funcionará, ya que es de 2 bytes)

 public static byte[] ToByteArray(string value) { char[] charArr = value.ToCharArray(); byte[] bytes = new byte[charArr.Length]; for (int i = 0; i < charArr.Length; i++) { byte current = Convert.ToByte(charArr[i]); bytes[i] = current; } return bytes; } 

Manteniéndolo simple

Un refinamiento a la edición de JustinStolle (uso de Eran Yogev de BlockCopy).

La solución propuesta es más rápida que usar encoding. El problema es que no funciona para codificar matrices de bytes de longitud desigual. Como se da, genera una excepción fuera de límite. Al boost la longitud en 1, se deja un byte final al decodificar desde la cadena.

Para mí, la necesidad llegó cuando quería codificar desde DataTable a JSON . Estaba buscando una forma de codificar campos binarios en cadenas y decodificar desde cadena a byte[] .

Por lo tanto, creé dos clases: una que envuelve la solución anterior (cuando se codifica desde cadenas está bien, porque las longitudes son siempre pares) y otra que maneja la encoding byte[] .

Resolví el problema de longitud desigual añadiendo un solo carácter que me dice si la longitud original de la matriz binaria era impar (‘1’) o incluso (‘0’)

Como sigue:

 public static class StringEncoder { static byte[] EncodeToBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string DecodeToString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } } public static class BytesEncoder { public static string EncodeToString(byte[] bytes) { bool even = (bytes.Length % 2 == 0); char[] chars = new char[1 + bytes.Length / sizeof(char) + (even ? 0 : 1)]; chars[0] = (even ? '0' : '1'); System.Buffer.BlockCopy(bytes, 0, chars, 2, bytes.Length); return new string(chars); } public static byte[] DecodeToBytes(string str) { bool even = str[0] == '0'; byte[] bytes = new byte[(str.Length - 1) * sizeof(char) + (even ? 0 : -1)]; char[] chars = str.ToCharArray(); System.Buffer.BlockCopy(chars, 2, bytes, 0, bytes.Length); return bytes; } } 
 var result = System.Text.Encoding.Unicode.GetBytes(text); 

¿Alguien ve alguna razón por la cual no hacer esto?

 mystring.Select(Convert.ToByte).ToArray()