none
Manejar cadena de bytes RRS feed

  • Pregunta

  • Hola:

    Me llega una entrada de bytes. Por ejemplo todo esto:

    A1 siginica mensaje 1.

    A2 mensaje 2.

    30 es el tamaño de bytes a recibir.

    los demás datos son el contenido.

    No me lee el contenido completo. Si lee los tamaños de las variables.

    using System;
    
    namespace Concatenar_tramas_variables_Consola_02_cs
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Concatenar variables";
    
                // Tamaño ventana consola.
                Console.SetWindowSize(60, 30);
    
                // Color pantalla y letras.
                Console.ForegroundColor = ConsoleColor.Black;
                Console.BackgroundColor = ConsoleColor.White;
                Console.Clear();
    
                // Concatenación de variables. Para que cada parte de la trama
                // puedas comentar fácilmente.
                string cmd = "";
                byte[] datos = {
                    0x48, 0x6F, 0x6C, 0x61, 0x20, 0x6D, 0x69, 0x20, 0x6D, 0x75, 0x79, 0x20,
                    0x64, 0x69, 0x73, 0x74, 0x69, 0x6E, 0x67, 0x75, 0x69, 0x64, 0x6F, 0x20,
                    0x61, 0x6D, 0x69, 0x67, 0x6F, 0x2E
                };
    
    
                cmd = "";
                cmd = cmd + "A1";       // Es la foto 1.
                cmd = cmd + "30";    // Es el tamaño del array.   
                cmd = cmd + datos;  // Son los datos que enviará Arduino al PC.
    
                // Visualiza tamaño de los bytes de datos.
                Console.WriteLine(datos.Length.ToString());
    
                // Visualiza tamaño completo.
                Console.WriteLine(cmd.Length.ToString());
    
                // Visualiza texto completo.
                Console.WriteLine(cmd.ToString());           
    
                // Pulse cualquier tecla para salir.
                Console.ReadKey();
            }
        }
    }

    Mi idea es recibir el tamaño completo de dos mesnajes enuna sola tramas de bytes, por ejemplo.

    A130datosDelMensajeA230unSegundoMensaje

    Separados sería así:

    A1
    30
    datosDelMesnaje
    A2
    30
    unSegundoMesnaje.

    Lo ideal es poner en otro aspecto para identificar cuando es A1, cuando es 30 y cuando es mensaje. Por ejemplo.

    *# Significa comienzo de un tramo de byte a leer.

    ### Significa el final de ese tramo.

    Por cada tramo leído, por ejemplo este.

    *#A1###*#30###*#datosDelMensaje###*#A2###*#30###*#unSegundoMensaje###

    Desde que detecte la primera parte de un mismo tramo de bytes como en este caso.

    *#A1###

    Se guarda en una variable byte1[] por llamarlo de alguna manera.

    Luego detecta la segunda parte que es este: *#30###, se guarda en una segunda variabel, así sucesivamente.

    Me imagino que primero guarda todo el tramo recibido completo en una sola bariable tipo byte array. Luego se van dividiendo.

    ¿Cómo se hace lo que piso?

    Parece complicado.

    Gracias.


    http://electronica-pic.blogspot.com

    domingo, 12 de julio de 2020 16:25

Respuestas

  • hola

    usa un foreach

    foreach(var item in data){
    
       //aqui tendras cada item
    
    }


    si quieres evitar los espacios usa

    string[] data = datos2.Split(new char[] { '*', '#' }, StringSplitOptions.RemoveEmptyEntries);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 14 de julio de 2020 0:58
  • >>No se si tendrá ventaja más que el for.

    la ventaja es que queda mas prolijo y te evitas acceder al valor por su indice cuando puede tenerlo directamente

    foreach(var item in data){
       Console.WriteLine(item);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 14 de julio de 2020 1:10

Todas las respuestas

  • Hola:

    Resuelto de de arriba, me da com resultado:

    A130Hola mi muy distinguido amigo.

    Falta lo de delimitadores, para poder entender partes de la trama.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 12 de julio de 2020 18:33
  • Hola  Metaconta

      

    a que te refieres con Falta lo de delimitadores, para poder entender partes de la trama.

    Quieres separar el texto a la hora de crear 1 mensaje? no sé como quieras separarlo pero por que no ponerle un separador cada vez que creas el mensaje? Console.WriteLine("####");  

    https://docs.microsoft.com/es-es/dotnet/standard/base-types/character-escapes-in-regular-expressions

    Gracias por usar los foros de MSDN. 

      

    Andres Aguilar

     ____________________________ 

      

    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.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    lunes, 13 de julio de 2020 17:21
    Moderador
  • Si me llega este mensaje o tramas de bytes que es este,

    *#A1###*#30###*#datosDelMensaje###*#A2###*#30###*#unSegundoMensaje###

    Me detecta por medio esto:

    *# = Comiendo de trozo de tramas de bytes o cadenas de caracteres.

    A1 = Es lo que quiero guardar en una variable y mostrarlo en Console.WriteLine(variable);

    ### = Indica el final de ese trozo de cadena.

    Como puedes ver arriba, vuelve otra vez empezar con *#, dentro de ella pone un 30 y termina en ###, en el cual, escojo por separado en otra variable2 el número 30 y lo muestro en pantalla.

    Sigo otra vez con *#, dentro de ella está datosDelMensaje y termina en ###.

    Así sucesivamente. En pantalla me va saliendo esto:

    A1
    30
    datosDelMensaje
    A2
    30
    unSegundoMensaje


    ...

    Gracias.


    http://electronica-pic.blogspot.com



    • Editado Metaconta lunes, 13 de julio de 2020 19:00
    lunes, 13 de julio de 2020 18:54
  • Hola Metaconta, 

      

    okay ya te sale eso pero que quieres lograr ahora especificamente?

     

     Andres Aguilar

     ____________________________ 


    lunes, 13 de julio de 2020 21:45
    Moderador
  • Hola Andrés:

    Recibir datos o tramas de bytes, que se almacena en una variable y hacer que esa trama de bytes se parta en partes que yo quiera y se muestre en pantalla.

    Es en resumen de lo de arriba indicado.

    Espero que se entienda.

    Saludos.


    http://electronica-pic.blogspot.com

    lunes, 13 de julio de 2020 21:52
  • hola

    >>hacer que esa trama de bytes se parta en partes que yo quiera y se muestre en pantalla.

     Convert Byte Array To String In C#

    puedes usar el BitConverter.ToString() para obtener el string en base a los bytes

    o quizas el Encoding.UTF8.GetString()

    al tener en un string lo podras mostrar en pantalla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 13 de julio de 2020 22:10
  • Gracias.

    Tengo estas variables, aunque no lo parezca, tiene exactamente el mismo contenido.

                string datos2 = "*#A1###*#30###*#datosDelMensaje###*#A2###*#30###*#unSegundoMensaje###";
    
                byte[] datos3 = {
                    0x2A, 0x23, 0x41, 0x31, 0x23, 0x23, 0x23, 0x2A, 0x23, 0x33, 0x30, 0x23,
                    0x23, 0x23, 0x2A, 0x23, 0x64, 0x61, 0x74, 0x6F, 0x73, 0x44, 0x65, 0x6C,
                    0x4D, 0x65, 0x6E, 0x73, 0x61, 0x6A, 0x65, 0x23, 0x23, 0x23, 0x2A, 0x23,
                    0x41, 0x32, 0x23, 0x23, 0x23, 0x2A, 0x23, 0x33, 0x30, 0x23, 0x23, 0x23,
                    0x2A, 0x23, 0x75, 0x6E, 0x53, 0x65, 0x67, 0x75, 0x6E, 0x64, 0x6F, 0x4D,
                    0x65, 0x6E, 0x73, 0x61, 0x6A, 0x65, 0x23, 0x23, 0x23
                };

    He puesto esta instrucción para cortar.

    string[] data = datos2.Split(new char[] { '*', '#' });

    Muestra en la ventana de arriba que están separados.

    Ahora falta, ya será con un for, qu eno me sal epor mucho que intente, que me muestre los datos separados que ya contiene la variable data.

    Según captura


    http://electronica-pic.blogspot.com

    martes, 14 de julio de 2020 0:25
  • Si llo pongo así:

                string[] data = datos2.Split(new char[] { '*', '#' });
    
                for (int i = 0; i < data.Length; i++)
                {
                    Console.Write(data[i]);
                }

    En serie me lo muestra en pantalla así.

    A130datosDelMensajeA230unSegundoMensaje

    Si en el for pongo en Console:WriteLine, me lo muestra uno debajo del otro por cada parte separada, pero con muchos espacios.

    A1




    30




    datosDelMensaje




    A2




    30




    unSegundoMensaje


    ¿Hay alguna manera que me lo muestre más pegado en columna como muestra abajo?

    A1
    30
    datosDelMensaje
    A2
    30
    unSegundoMensaje

    Gracias.


    http://electronica-pic.blogspot.com

    martes, 14 de julio de 2020 0:55
  • hola

    usa un foreach

    foreach(var item in data){
    
       //aqui tendras cada item
    
    }


    si quieres evitar los espacios usa

    string[] data = datos2.Split(new char[] { '*', '#' }, StringSplitOptions.RemoveEmptyEntries);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 14 de julio de 2020 0:58
  • Gracias, lo hice así:

    string[] data = datos2.Split("*#".ToCharArray(), // Quitar todo lo que tenga en * y #. StringSplitOptions.RemoveEmptyEntries); // Eliminar entradas en blanco.

    for (int i = 0; i < data.Length; i++) { Console.WriteLine(data[i]); }

    En cuanto a

    foreach(var item in data){
    
       //aqui tendras cada item
    
    }

    No se si tendrá ventaja más que el for.


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 14 de julio de 2020 1:06
    martes, 14 de julio de 2020 1:06
  • >>No se si tendrá ventaja más que el for.

    la ventaja es que queda mas prolijo y te evitas acceder al valor por su indice cuando puede tenerlo directamente

    foreach(var item in data){
       Console.WriteLine(item);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 14 de julio de 2020 1:10
  • Hola Metaconta

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

    martes, 14 de julio de 2020 16:57
    Moderador