Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 27 Diciembre 2023, 07:06 am



Título: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: Meta en 27 Diciembre 2023, 07:06 am
Hola:

Tengo este código y me salta este error. Supuestamente es todo a byte[], nada de char[].

Código
  1. using System;
  2. using System.Text;
  3.  
  4. namespace Almacenar_datos_en_un_array_tipo_byte_Consola_01
  5. {
  6.    internal class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            byte[] dataArray = new byte[1024]; // Tamaño máximo del array de bytes.
  11.  
  12.            Console.WriteLine("Escribe un texto y pulsa Enter:");
  13.            int bytesRead = Console.In.Read(dataArray, 0, dataArray.Length); // Lee los bytes desde la consola y los guarda en el array.
  14.  
  15.            Console.WriteLine("Datos almacenados en el array:");
  16.            for (int i = 0; i < bytesRead; i++)
  17.            {
  18.                Console.Write(dataArray[i] + " ");
  19.            }
  20.            Console.WriteLine();
  21.  
  22.            Console.WriteLine("Texto almacenado en el array:");
  23.            string text = Encoding.Default.GetString(dataArray, 0, bytesRead); // Convierte los bytes a una cadena de texto.
  24.            Console.WriteLine(text);
  25.        }
  26.    }
  27. }

Justo aquí.
Código
  1. int bytesRead = Console.In.Read(dataArray, 0, dataArray.Length); // Lee los bytes desde la consola y los guarda en el array.

En el primer dataArray.


Título: Re: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: profinet en 27 Diciembre 2023, 10:08 am
En C#, el tipo de dato char tiene un tamaño de 16 bits, lo que le permite representar cualquier carácter Unicode. Por otro lado, el tipo de dato byte tiene un tamaño de 8 bits.
Es posible que haya cierta confusión, ya que en lenguajes como C/C++, ambos tipos de datos comparten el mismo tamaño, ya que el tipo char se utiliza para representar caracteres ASCII, que son de 8 bits en esos contextos.
Sin embargo, en el entorno de C#, el tipo char se ha diseñado para manejar un rango más amplio de caracteres Unicode, y por lo tanto, su tamaño es de 16 bits.

Si quieres rizar el rizo, debes guardar la entrada del usuario como un string (una cadena de caracteres con terminador nulo), codificarlos en UTF8 (8-bit Unicode Transformation Format) y volver a descodificarlos.

Código
  1. using System;
  2. using System.Text;
  3.  
  4. internal class Program {
  5.    static void Main(string[] args) {
  6.        Console.WriteLine("Escribe un texto y pulsa Enter:");
  7.        string inputText = Console.ReadLine(); // Lee una línea de texto desde la consola.
  8.        byte[] byteArray = Encoding.UTF8.GetBytes(inputText); // Convierte el texto a un byte[] usando UTF-8.
  9.  
  10.        Console.WriteLine("Datos almacenados en el array:");
  11.        foreach (byte b in byteArray) {
  12.            Console.WriteLine(b);
  13.        }
  14.        Console.WriteLine();
  15.  
  16.        Console.WriteLine("Texto almacenado en el array:");
  17.        string text = Encoding.UTF8.GetString(byteArray); // Convierte los bytes a una cadena de texto.
  18.        Console.WriteLine(text);
  19.    }
  20. }
  21.  

Código:
Escribe un texto y pulsa Enter:
hola
Datos almacenados en el array:
104
111
108
97

Texto almacenado en el array:
hola
   


Título: Re: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: Meta en 27 Diciembre 2023, 16:45 pm
En string no lo prefiero, porque ahora prefiero hacer pruebas directamente en un array, ya que los datos me vienen directamente del puerto serie y debo capturar todo tipo de datos en Bytes, incluyendo /r y /n por poner un ejemplo.

Aún así cuando llegue a mi casa pruebo tu código y muchas gracias.

Luego te comento.


Título: Re: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: Meta en 29 Diciembre 2023, 03:50 am
Lo intenté hacer de esta otra forma.

Código
  1. using System;
  2. using System.Text;
  3.  
  4. namespace Almacenar_datos_en_un_array_tipo_byte_Consola_01
  5. {
  6.    internal class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.  
  11.            // Tamaño máximo del array de bytes.
  12.            byte[] byteArray = new byte[1024];
  13.  
  14.            // Convertir de byte[] a char[]
  15.            char[] charArray  = Encoding.Default.GetString(byteArray).ToCharArray();
  16.  
  17.            Console.WriteLine("Escribe un texto y pulsa Enter:");
  18.  
  19.            // Lee los bytes desde la consola y los guarda en el array.
  20.            int leerBytes = Console.In.Read(charArray, 0, charArray.Length);
  21.  
  22.            Console.WriteLine("Datos almacenados en el array:");
  23.            for (int i = 0; i < leerBytes; i++)
  24.            {
  25.                Console.Write(byteArray[i] + " ");
  26.            }
  27.            Console.WriteLine();
  28.  
  29.            Console.WriteLine("Texto almacenado en el array:");
  30.  
  31.            // Convierte los bytes a una cadena de texto.
  32.            string texto = Encoding.Default.GetString(byteArray, 0, leerBytes);
  33.            Console.WriteLine(texto);
  34.  
  35.            // Pulse cualquier tecla para salir.
  36.            Console.ReadKey();
  37.        }
  38.    }
  39. }

Me lee todo como ceros.


Título: Re: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: profinet en 29 Diciembre 2023, 09:01 am
Si quieres leer raw bytes desde la consola, necesitas usar Console.OpenStandardInput().

Código
  1. using System;
  2. namespace Almacenar_datos_en_un_array_tipo_byte_Consola_01 {
  3.    internal class Program {
  4.        static void Main(string[] args) {
  5.            // Tamaño máximo del array de bytes.
  6.            byte[] byteArray = new byte[1024];
  7.  
  8.            Console.WriteLine("Escribe un texto y pulsa Enter:");
  9.  
  10.            // Lee los bytes desde la consola y los guarda en el array.
  11.            int leerBytes = Console.OpenStandardInput().Read(byteArray, 0, byteArray.Length);
  12.  
  13.            Console.WriteLine("Datos almacenados en el array:");
  14.            for (int i = 0; i < leerBytes; i++) {
  15.                Console.Write(byteArray[i] + " ");
  16.            }
  17.            Console.WriteLine();
  18.  
  19.            Console.WriteLine("Texto almacenado en el array:");
  20.  
  21.            // Convierte los bytes a una cadena de texto.
  22.            string texto = System.Text.Encoding.Default.GetString(byteArray, 0, leerBytes);
  23.            Console.WriteLine(texto);
  24.  
  25.            // Pulse cualquier tecla para salir.
  26.            Console.ReadKey();
  27.        }
  28.    }
  29. }
  30.  

Código:
Escribe un texto y pulsa Enter:
hola
Datos almacenados en el array:
104 111 108 97 13 10
Texto almacenado en el array:
hola

Si planeas leer datos directamente desde el puerto serie en C#, será necesario trabajar con un flujo de entrada/salida (I/O stream).
Afortunadamente, la clase SerialPort en C# proporciona métodos predefinidos para manejar la lectura y escritura de datos en un puerto serie.

De todos modos, un string no deja de ser una cadenas de caracteres, y cada caracter, pese a ocupar 16 bits, almacena un byte (o doble byte) que dependiendo del tipo de codificación, se imprime en pantalla. Por ejemplo, usando la tabla ASCII si la codificación es UTF8: https://elcodigoascii.com.ar/

En caso de que lo que leas, no tenga un símbolo gráfico relacionado, se imprime un carácter residual. En este contexto, es crucial destacar que el "byte" en sí mismo continuará almacenado en el carácter correspondiente. La distinción recae en el enfoque que aplicas a la manipulación de los datos.


Título: Re: Error en este código: no se puede convertir de 'byte[]' a 'char[]'
Publicado por: Meta en 29 Diciembre 2023, 18:20 pm
Funciona tu código.   ;-)
Estás hecho un campeón. Gracias a todos.  ;D ;D ;D ;-)

El primer código funciona si pongo en vez de byte[] ponerlo a char[], cosa que no me interesa. El tuyo es el que quiero.

Y si, estoy aprendiendo con ejemplos sueltos antes de meterle mano al puerto serie.

Felices fiestas 2023.  :D