none
Almacenar datos en una variable RRS feed

  • Pregunta

  • Hola:

    En modo consola. Quiero escribir caracteres y guardarlo en una variable tipo Byte[]. Cuando pulse Enter, se muestre todo el mensaje que he escrito. Si vuelvo a pulsar Enter, se cierra el programa porque ya finalizó.

    ¿Cómo se hace?

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 19 de diciembre de 2020 14:30

Respuestas

  • Si hay que usar char, pues se usa char, contar que funcione como la seda.

    Bueno! Hubiéramos empezado por ahí! Menos mal, así va a ser más viable. Decime si funciona, a mi algunos caracteres no me salen bien, pero creo que es por el idioma del teclado, pero quizás a vos te funciona.

    using System;
    using System.Text;
    
    namespace ConsoleAppReadByteArray
    {
        class Program
        {
            static void Main(string[] args)
            {
                char[] array = new char[500];
                ConsoleKeyInfo key;
                int i = 0;
                int nextLim = 500; // contendrá el próximo límite de entrada
    
                while (true) // ciclo infinito (del cual se sale con break; cuando algo ocurre)
                {
                    key = Console.ReadKey(true);
                    if (key.Key == ConsoleKey.Enter) // si se pulsó Enter se sale del ciclo
                    { 
                        break; 
                    }
                    else if (key.Key == ConsoleKey.Backspace) // si se pulsó Atrás
                    {
                        i--; // disminuye el contador i
                        Console.Write("\b \b"); // retrocede, avanza y borra el caracter, y vuelve a retroceder
                    }
                    else if (!Char.IsControl(key.KeyChar))
                    {
                        Console.Write(key.KeyChar.ToString()); // se escribe el caracter pulsado 
    
                        if (i == nextLim) // si se alcanzó el actual límite de entrada
                        {
                            char[] temp = (char[])array.Clone(); // se clona el array de bytes
                            array = new char[nextLim + 500]; // luego se reasigna la capacidad de array
                            Buffer.BlockCopy(temp, 0, array, 0, nextLim); // se recupera el contenido en array
                            nextLim += 500; // se aumenta nextLim para la próxima vez que se llegue al límite
                        }
                        array[i++] = key.KeyChar;
                    } 
                }
                Console.WriteLine();
                // limita al array en el contador i por si se borraron caracteres, porque no se pueden borrar del array
                Console.WriteLine(new string(array, 0, i)); 
                Console.ReadLine();
            }
        }
    }
    

    • Marcado como respuesta EricRRModerator miércoles, 23 de diciembre de 2020 16:55
    lunes, 21 de diciembre de 2020 0:18

Todas las respuestas

  • Hola para obtener el byte[] de una cadena simplemente harías 

    byte[] variable = System.Text.Encoding.UTF8.GetBytes(cadena);


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 19 de diciembre de 2020 20:58
    Moderador
  • Hola Metaconta

    Tanto tiempo! Dónde estabas?

    using System;
    using System.Text;
    
    namespace ConsoleAppReadByteArray
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] array = new byte[500];
                ConsoleKey key;
                int i = 0;
    
                while ((key = Console.ReadKey(true).Key) != ConsoleKey.Enter)
                {
                    Console.Write(key.ToString());
                    array[i++] = Convert.ToByte(key);
                }
                Console.WriteLine();
                Console.WriteLine(Encoding.Default.GetString(array));
                Console.ReadLine();
            }
        }
    }
    

    Esta, la verdad, fue un poquito más fácil que algunas anteriores.

    Te lee caracteres y los va escribiendo, hasta que pulsas Enter, y luego escribe todo lo que tipeaste y espera que pulses Enter otra vez y termina. 

    Saludos

    Pablo

    sábado, 19 de diciembre de 2020 21:46
  • Hola Metaconta

    Tanto tiempo! Dónde estabas?

    using System;
    using System.Text;
    
    namespace ConsoleAppReadByteArray
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] array = new byte[500];
                ConsoleKey key;
                int i = 0;
    
                while ((key = Console.ReadKey(true).Key) != ConsoleKey.Enter)
                {
                    Console.Write(key.ToString());
                    array[i++] = Convert.ToByte(key);
                }
                Console.WriteLine();
                Console.WriteLine(Encoding.Default.GetString(array));
                Console.ReadLine();
            }
        }
    }

    Esta, la verdad, fue un poquito más fácil que algunas anteriores.

    Te lee caracteres y los va escribiendo, hasta que pulsas Enter, y luego escribe todo lo que tipeaste y espera que pulses Enter otra vez y termina. 

    Saludos

    Pablo

    Cuando pones.

     byte[] array = new byte[500];

    No se puede hacer de alguna manera infinito. Porque 500 está limitado a 500.

    ¿Cuánto puedo poner como máximo?

    Voy a probar y te cuento. ;)

    Gracias.


    http://electronica-pic.blogspot.com


    • Editado Metaconta sábado, 19 de diciembre de 2020 23:32
    sábado, 19 de diciembre de 2020 23:30
  • No, si hablamos de un vector como byte[] o cualquier otro, no se puede hacer infinito. El máximo que le podes poner es la cantidad de memoria libre que hay en el sistema. 

    Si queres usar algo más amigable, podes usar List<byte> list, que si bien tiene un limite (la propiedad Capacity), podes aumentarlo sin problemas cuando lo necesites, no como con el array. Pero vos dijiste muy claro que querias usar byte[].

    domingo, 20 de diciembre de 2020 0:22
  • Hola:

    Lo he probado. Me ocurre dos cosas.

    1. ¿Por qué escribe siempre en mayúsculas?
     2. A parte que es un jaleo poner tildes. ¿Por qué al pulsar la tecla espacio me pone la palabra SpaceBar?

    Tiene que escribir cualquier caracter tal como escribo en este foro.

    3. Cuando llega al límite, aparece un error:

    Me imagino que se podrá hacer mejor.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 20 de diciembre de 2020 8:07
  • Hola 

    Tenes razón, no reparé en algunos detalles, lo que pasa es que no es muy usual estas cosas en programación, no lo tengo muy familiar, como los objetos y el entorno que uso, por ejemplo, para programar videojuegos. De hecho, tuve que googlear algunas cosas. Aunque la lógica es lo mismo siempre. Pero entiendo que usas este tipo de código en tu dispositivo. 

    Lo que me parece (que lo estuve viendo) es que al limitar los caracteres, que de por si ocupan 2 bytes, a un único byte, vas a tener problemas con la Ñ y con las vocales acentuadas, para esto creo que no hay solución, excepto usar char en lugar de byte. De hecho, me fijé con el Intellisense, y la Ñ no está incluida en la enumeración de ConsoleKey. 

    Aquí el código arreglado (cambié casi todo):

    using System;
    using System.Text;
    
    namespace ConsoleAppReadByteArray
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] array = new byte[500];
                ConsoleKeyInfo key;
                int i = 0;
                int nextLim = 500; // contendrá el próximo límite de entrada
    
                while (true) // ciclo infinito (del cual se sale con break; cuando algo ocurre)
                {
                    key = Console.ReadKey(true);
                    if (key.Key == ConsoleKey.Enter) // si se pulsó Enter se sale del ciclo
                        break;
                    else if (key.Key == ConsoleKey.Backspace) // si se pulsó Atrás
                    {
                        i--; // disminuye el contador i
                        Console.Write("\b \b"); // retrocede, avanza y borra el caracter, y vuelve a retroceder
                        continue; // y fuerza al ciclo a reiniciarse en su cabecera, porque lo que sigue no se hace en este caso
                    }
    
                    Console.Write(key.KeyChar.ToString()); // se escribe el caracter pulsado 
    
                    if (i == nextLim) // si se alcanzó el actual límite de entrada
                    {
                        byte[] temp = (byte[])array.Clone(); // se clona el array de bytes
                        array = new byte[nextLim + 500]; // luego se reasigna la capacidad de array
                        Buffer.BlockCopy(temp, 0, array, 0, nextLim); // se recupera el contenido en array
                        nextLim += 500; // se aumenta nextLim para la próxima vez que se llegue al límite
                    }
                    array[i++] = Convert.ToByte(key.KeyChar); 
                }
                Console.WriteLine();
                // limita al array en el contador i por si se borraron caracteres, porque no se pueden borrar del array
                Console.WriteLine(Encoding.Default.GetString(array, 0, i)); 
                Console.ReadLine();
            }
        }
    }
    

    Saludos

    domingo, 20 de diciembre de 2020 14:15
  • Si pulsas también la flecha atrás, se desplaza hacia delante en blanco. Hace cosas raras. Debería comportarse como una consola normal y corriente tal como hace el cmd o powershell. Solo que sea capaz de escribir más de 255 caracteres.

    Si hay que usar char, pues se usa char, contar que funcione como la seda.


    http://electronica-pic.blogspot.com

    domingo, 20 de diciembre de 2020 15:22
  • Si hay que usar char, pues se usa char, contar que funcione como la seda.

    Bueno! Hubiéramos empezado por ahí! Menos mal, así va a ser más viable. Decime si funciona, a mi algunos caracteres no me salen bien, pero creo que es por el idioma del teclado, pero quizás a vos te funciona.

    using System;
    using System.Text;
    
    namespace ConsoleAppReadByteArray
    {
        class Program
        {
            static void Main(string[] args)
            {
                char[] array = new char[500];
                ConsoleKeyInfo key;
                int i = 0;
                int nextLim = 500; // contendrá el próximo límite de entrada
    
                while (true) // ciclo infinito (del cual se sale con break; cuando algo ocurre)
                {
                    key = Console.ReadKey(true);
                    if (key.Key == ConsoleKey.Enter) // si se pulsó Enter se sale del ciclo
                    { 
                        break; 
                    }
                    else if (key.Key == ConsoleKey.Backspace) // si se pulsó Atrás
                    {
                        i--; // disminuye el contador i
                        Console.Write("\b \b"); // retrocede, avanza y borra el caracter, y vuelve a retroceder
                    }
                    else if (!Char.IsControl(key.KeyChar))
                    {
                        Console.Write(key.KeyChar.ToString()); // se escribe el caracter pulsado 
    
                        if (i == nextLim) // si se alcanzó el actual límite de entrada
                        {
                            char[] temp = (char[])array.Clone(); // se clona el array de bytes
                            array = new char[nextLim + 500]; // luego se reasigna la capacidad de array
                            Buffer.BlockCopy(temp, 0, array, 0, nextLim); // se recupera el contenido en array
                            nextLim += 500; // se aumenta nextLim para la próxima vez que se llegue al límite
                        }
                        array[i++] = key.KeyChar;
                    } 
                }
                Console.WriteLine();
                // limita al array en el contador i por si se borraron caracteres, porque no se pueden borrar del array
                Console.WriteLine(new string(array, 0, i)); 
                Console.ReadLine();
            }
        }
    }
    

    • Marcado como respuesta EricRRModerator miércoles, 23 de diciembre de 2020 16:55
    lunes, 21 de diciembre de 2020 0:18
  • Hola Metaconta,

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?

    Espero su respuesta.

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 22 de diciembre de 2020 15:13
    Moderador