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