válida variable una para matriz longitud frombase64string example convertir convert caracteres cadena array c# arrays string char byte

variable - string to char array c#



La conversión de cadena a byte[] crea cero caracteres (5)

En esta función convertir

public 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; } byte[] test = GetBytes("abc");

La matriz resultante contiene cero caracteres

test = [97, 0, 98, 0, 99, 0]

Y cuando convertimos byte [] a string, el resultado es

string test = "a b c "

Cómo lo hacemos para que no cree esos ceros


(97,0) es la representación Unicode de ''a''. Unicode representa cada personaje en dos bytes. Entonces no puedes eliminar ceros. Pero puede cambiar la codificación a ASCII. Intente seguir para Convertir cadena a byte [].

byte[] array = Encoding.ASCII.GetBytes(input);


En realidad, .net (al menos para 4.0) cambia automáticamente el tamaño de char cuando se serializa con BinaryWriter

Los caracteres UTF-8 tienen longitud variable (podría no ser de 1 byte), los caracteres ASCII tienen 1 byte

''ē'' = 2 bytes

''e'' = 1 byte

Debe tenerse en cuenta cuando se usa

BinaryReader.ReadChars(stream)

En el caso de la palabra "ēvalds" = 7 bytes, el tamaño será diferente de "evalds" = 6 bytes


Intente especificar la Encoding explícitamente. Puede usar el siguiente código para convertir cadenas a bytes con codificación especificada

byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abc");

si imprime contenido de bytes, obtendrá { 97, 98, 99 } que no contiene ceros, como en su ejemplo En su ejemplo, la codificación predeterminada utiliza 16 bits por símbolo. Puede ser observador al imprimir los resultados de

System.Text.Encoding.Unicode.GetBytes("abc"); // { 97, 0, 98, 0, 99, 0 }

Luego, al convertirlo de nuevo, debe seleccionar la codificación adecuada:

string str = System.Text.Encoding.ASCII.GetString(bytes); Console.WriteLine (str);

Imprime "abc" como es de esperar


Para despejar la confusión sobre su respuesta, el tipo de caracteres en C # toma 2 bytes. Entonces, string.toCharArray () devuelve una matriz en la que cada elemento toma 2 bytes de almacenamiento. Al copiar a una matriz de bytes donde cada elemento ocupa 1 byte de almacenamiento, se produce una pérdida de datos. De ahí los ceros que aparecen en el resultado.
Como se sugiere, Encoding.ASCII.GetBytes es una opción más segura de usar.


Primero veamos qué hace mal tu código. char es de 16 bits (2 bytes) en .NET framework. Lo que significa que cuando escribe sizeof(char) , devuelve 2 . str.Length es 1 , por lo que en realidad su código será byte[] bytes = new byte[2] es el mismo byte[2] . Por lo tanto, cuando utiliza el método Buffer.BlockCopy() , realmente copia 2 bytes de una matriz de origen a una matriz de destino. Lo que significa que su método GetBytes() devuelve bytes[0] = 32 y bytes[1] = 0 si su cadena es " " .

Intente utilizar Encoding.ASCII.GetBytes() lugar.

Cuando se reemplaza en una clase derivada, codifica todos los caracteres de la cadena especificada en una secuencia de bytes.

const string input = "Soner Gonul"; byte[] array = Encoding.ASCII.GetBytes(input); foreach ( byte element in array ) { Console.WriteLine("{0} = {1}", element, (char)element); }

Salida:

83 = S 111 = o 110 = n 101 = e 114 = r 32 = 71 = G 111 = o 110 = n 117 = u 108 = l