elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Indicar bien valores de un Byte en concreto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Indicar bien valores de un Byte en concreto  (Leído 2,292 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Indicar bien valores de un Byte en concreto
« en: 20 Abril 2021, 07:26 am »

Hola:

Este programa consiste en leer bits en ciertos Bytes. En este manual que puedes ver aquí.

Ver manual en pdf.

Página 7 / 21.

Concretamente en el Byte S2 y en los bit 6 y 5 se puede hacer una combinación en 4 estados que tiene que ser así:

6 - 5
------
0 - 0 normal [always use this value]
0 - 1 boost one stage
1 - 0 boost two stages
1 - 1 buck one stag



Rrecordando que los bits 6 y 5 del Byte S2 entre estos dos hay cuatro combinaciones indicado justo arriba.

Por ejemplo, si el Byte S2 tiene la combinación de los bits 6 y 5 de esta manera.

bit 6 igual a 0 y el bit 5 igual a 1, muestra el mensaje boost one stage.

Porque 0 - 1 es el que le corresponde y se muestra en pantalla. Sol me falta completar esta parte.

Dejo el código completo .
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Delimitador_consola_03
  8. {
  9.    class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            #region Configuración ventana.
  14.            // Título de la ventana.
  15.            Console.Title = "Probando manipulación de cadena";
  16.  
  17.            // Tamaño de la ventana, x, y.
  18.            Console.SetWindowSize(100, 35);
  19.  
  20.            // Color de fondo.
  21.            Console.BackgroundColor = ConsoleColor.DarkBlue;
  22.  
  23.            // Color de las letras.
  24.            Console.ForegroundColor = ConsoleColor.Yellow;
  25.  
  26.            // Limpiar pantalla y dejarlo todo en color de fondo.
  27.            Console.Clear();
  28.  
  29.            // Visible el cursor.
  30.            Console.CursorVisible = true;
  31.            #endregion
  32.  
  33.            // Cree una codificación ISO-8859-1.
  34.            Encoding ISO_8859_1 = Encoding.GetEncoding("ISO-8859-1");
  35.  
  36.            #region Variables.
  37.            // Partir a trocitos estos caracteres.
  38.            char[] delimitadorComandoB = { '#', ',', 'O', 'I', 'L', 'B', 'V', 'F', 'H', 'R', 'S', };
  39.  
  40.            // Es la cadena de caracteres que me llegó desde el puerto serie.
  41.            // En este ejemplo lo dejo en la varible directamente.
  42.            // Una cadena completa empieza con # y termina en <cr>, o lo que es lo mismo, /r.
  43.            string respuestaB = "#I223.3O224.0L000B100V26.4F50.2H50.2R0080S„€€„À"; // Comando B.
  44.  
  45.            // Se guarga en este array tipo string los datos ya partidos a tozos.
  46.            string[] palabrasB = respuestaB.Split(delimitadorComandoB);
  47.  
  48.            // Tabla S1 descripción.
  49.            string[] DESCRIPCION_S1 =
  50.            {
  51.                "Indica que este byte está disponible y es válido. [Siempre 1]",             // Posición [0].
  52.                "Indica falla de energía de la red pública; ver detalles en S2.0 y S2.1.",
  53.                "Indica que la capacidad de la batería es menor que el umbral de apagado.",
  54.                "Indica que el zumbador está en estado de pitido.",
  55.                "Indica que la prueba de batería se está procesando.",
  56.                "Indica que el apagado programado está pendiente.",
  57.                "Indica que la restauración programada está pendiente.",
  58.                "Indica falla de hardware; ver detalles sobre el comando X71."               // Posición [7].
  59.            };
  60.  
  61.            string[] DESCRIPCION_S2 =
  62.            {
  63.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  64.                "--",
  65.                "XX",
  66.                "Indica sobretemperatura del inversor.",
  67.                "Indica que el inversor tiene una falla.",
  68.                "Indica que el inversor está apagado.",
  69.                "Indica que la frecuencia de la utilidad está fuera de rango.",
  70.                "Indica que el voltaje de la red pública está fuera de rango."
  71.            };
  72.  
  73.            string[] DESCRIPCION_S3 =
  74.            {
  75.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  76.                "Indica que la batería está completamente cargada.",
  77.                "Indica que la capacidad de la batería aún es menor que el umbral restaurado del UPS cuando la energía de la red pública restaurado.",
  78.                "Indica que la batería se está cargando.",
  79.                "Indica que la batería se está descargando.",
  80.                "Indica que la capacidad de la batería es inferior al 80 por ciento.",
  81.                "Reservado, debe ser 0.",
  82.                "Indica que la batería no está presente."
  83.            };
  84.  
  85.            string[] DESCRIPCION_S4 =
  86. {
  87.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  88.                "Indica que el bypass es una sobrecarga.",
  89.                "Indica que la derivación está activa.",
  90.                "Indica que la salida sufre un cortocircuito.",
  91.                "Indica que la salida tiene carga.",
  92.                "Indica que la salida está sobrecargada.",
  93.                "Indica que la frecuencia de salida está fuera de rango en bypass.",
  94.                "Indica que el voltaje de salida está fuera de rango en derivación."
  95.            };
  96.  
  97.            string[] DESCRIPCION_S5 =
  98. {
  99.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  100.                "Indica que no hay salida.",
  101.                "Para indicar que el tiempo de ejecución restante es inferior al umbral.",
  102.                "Para indicar que el zumbador está silenciado (no permanente) en este momento.",
  103.                "Para indicar falla de cableado.",
  104.                "Para indicar SAI en modo ECO.",
  105.                "Para indicar UPS en Bypass manual.",
  106.                "Arreglar 0."
  107.            };
  108.  
  109.            string[] DESCRIPCION_S6 =
  110.            {
  111.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  112.                "Indica UPS encendido.",
  113.                "Reservado, debe ser 0.",
  114.                "Reservado, debe ser 0.",
  115.                "Reservado, debe ser 0.",
  116.                "Reservado, debe ser 0.",
  117.                "Reservado, debe ser 0.",
  118.                "Reservado, debe ser 0."
  119.            };
  120.  
  121.            bool boolS1 = true;
  122.            bool boolS2 = false;
  123.            bool boolS3 = false;
  124.            bool boolS4 = false;
  125.            bool boolS5 = false;
  126.            bool boolS6 = false;
  127.            bool boolContador = true;
  128.            bool boolContador2 = false;
  129.            #endregion
  130.  
  131.            // Comando B.
  132.            Console.WriteLine();
  133.  
  134.            // Muestra los resultados en pantalla.
  135.            Console.WriteLine();
  136.            Console.WriteLine("El voltaje de la utilidad es de {0} voltios. ", palabrasB[2]); // I.
  137.            Console.WriteLine("El voltaje de salida del UPS es de {0} voltios. ", palabrasB[3]); // O.
  138.            Console.WriteLine("La carga actual de UPS es del {0} por ciento. ", palabrasB[4]); // L.
  139.            Console.WriteLine("La capacidad de la batería es del {0} por ciento. ", palabrasB[5]); // B.
  140.            Console.WriteLine("El voltaje de la batería es de {0} voltios. ", palabrasB[6]); // V.
  141.            //Console.WriteLine("La temperatura del gabinete del UPS es de {0} grados centígrados. ", palabrasB[7]); // T. No hay T. en mi versión.
  142.            Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[7]); // F.
  143.            Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[8]); // H.
  144.            Console.WriteLine("El tiempo de funcionamiento restante de la batería es de {0} minutos. ", palabrasB[9]);
  145.            //Console.WriteLine(@"Estos son los bits de estados que no se entiende.S:
  146.            //Aquí hay que leer cada bits como cuando se leyeron cada Byte arriba: ", (char)palabrasB[10]);
  147.  
  148.            char[] bits = palabrasB[10].ToCharArray();
  149.  
  150.            //int byteS1 = (byte)bits[0];
  151.            //int byteS2 = (byte)bits[1];
  152.            //int byteS3 = (byte)bits[2];
  153.            //int byteS4 = (byte)bits[3];
  154.            //int byteS5 = (byte)bits[4];
  155.            //int byteS6 = (byte)bits[5];
  156.  
  157.            //Console.WriteLine("Byte S1: {0}", byteS1.ToString());
  158.            //Console.WriteLine("Byte S2: {0}", byteS2.ToString());
  159.            //Console.WriteLine("Byte S3: {0}", byteS3.ToString());
  160.            //Console.WriteLine("Byte S4: {0}", byteS4.ToString());
  161.            //Console.WriteLine("Byte S5: {0}", byteS5.ToString());
  162.            //Console.WriteLine("Byte S6: {0}", byteS6.ToString());
  163.  
  164.  
  165.            //Console.WriteLine();
  166.            //Console.WriteLine(((byteS1 & 128) == 128) ? "ACTIVADO" : "DESACTIVADO");
  167.            //Console.WriteLine(((byteS1 & 128) == 128) ? "1" : "0");
  168.            //Console.WriteLine();
  169.  
  170.            Tabla();
  171.            int contador = 0;
  172.            for (int b = 0; b < bits.Length; b++)
  173.            {
  174.                for (int a = 7; a >= 0; a--)
  175.                {
  176.  
  177.                    Console.Write((((byte)bits[b]) & (1 << a)) >> a);
  178.                    Console.Write(" | ");
  179.  
  180.                    if ((contador <= 7) && (boolS1 == true))
  181.                    {
  182.                        Console.WriteLine(DESCRIPCION_S1[contador]);
  183.  
  184.                        if (contador == 7)
  185.                        {
  186.                            boolS1 = false;
  187.                            boolS2 = true;
  188.                            boolContador2 = true;
  189.                            contador = 0;
  190.                        }
  191.                    }
  192.                    else if ((contador <= 7) && (boolS2 == true))
  193.                    {
  194.                        Console.WriteLine(DESCRIPCION_S2[contador]);
  195.                        boolContador2 = false;
  196.                        if (contador == 7)
  197.                        {
  198.                            boolS2 = false;
  199.                            boolS3 = true;
  200.                            boolContador2 = true;
  201.                            contador = 0;
  202.                        }
  203.                    }
  204.                    else if ((contador <= 7) && (boolS3 == true))
  205.                    {
  206.                        Console.WriteLine(DESCRIPCION_S3[contador]);
  207.                        boolContador2 = false;
  208.                        if (contador == 7)
  209.                        {
  210.                            boolS3 = false;
  211.                            boolS4 = true;
  212.                            boolContador2 = true;
  213.                            contador = 0;
  214.                        }
  215.                    }
  216.                    else if ((contador <= 7) && (boolS4 == true))
  217.                    {
  218.                        Console.WriteLine(DESCRIPCION_S4[contador]);
  219.                        boolContador2 = false;
  220.                        if (contador == 7)
  221.                        {
  222.                            boolS4 = false;
  223.                            boolS5 = true;
  224.                            boolContador2 = true;
  225.                            contador = 0;
  226.                        }
  227.                    }
  228.                    else if ((contador <= 7) && (boolS5 == true))
  229.                    {
  230.                        Console.WriteLine(DESCRIPCION_S5[contador]);
  231.                        boolContador2 = false;
  232.                        if (contador == 7)
  233.                        {
  234.                            boolS5 = false;
  235.                            boolS6 = true;
  236.                            boolContador2 = true;
  237.                            contador = 0;
  238.                        }
  239.                    }
  240.                    else if ((contador <= 7) && (boolS6 == true))
  241.                    {
  242.                        Console.WriteLine(DESCRIPCION_S6[contador]);
  243.                        boolContador2 = false;
  244.                        if (contador == 7)
  245.                        {
  246.                            boolS6 = true;
  247.                            boolContador2 = true;
  248.                            contador = 0;
  249.                        }
  250.                    }
  251.  
  252.                    if (boolContador == true)
  253.                    {
  254.                        contador++;
  255.  
  256.                        if (boolContador2 == true)
  257.                        {
  258.                            contador = 0;
  259.                        }
  260.                    }
  261.                    //Console.WriteLine();
  262.                }
  263.                Console.WriteLine();
  264.            }
  265.  
  266.  
  267.            #region Tabla.
  268.            void Tabla()
  269.            {
  270.                Console.WriteLine();
  271.                Console.WriteLine("Byte | Bit | Estado | Descripción");
  272.                Console.WriteLine("-----+-----+-----------------------------------------------------------------------");
  273.            }
  274.            #endregion
  275.  
  276.            // Pulse cualquier tecla para salir.
  277.            Console.ReadKey();
  278.        }
  279.    }
  280. }

¿Cómo se soluciona este problema?

Saludos.


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Indicar bien valores de un Byte en concreto
« Respuesta #1 en: 20 Abril 2021, 15:49 pm »

Son matemáticas simples...

Todo aquel que se dedique a programar, una de las primeras cosas que debiera aprender es precisamente a operar con bits...

En NET (y otro muchos lenguajes), que aceptan operaciones de desplazamiento (heredadas del ensamblador), resultan más sencillas (y veloces)... aqui resuelto con division.

Código:
// Valor: el byte a procesar.
// Indice: punto desde el cual nos interesan los bits (rango 0-7) .
// Bits: Cantidad de bits que queremos tomar del byte.
byte = funcion BitSet(byte valor, byte indice, byte bits )
    valor = (valor / (2 ^ indice))              ' retira los 'indice' bits de 'abajo'
    devolver (valor And ((2 ^ bits) - 1))   ' retira los bits de 'arriba'.
End Function


235 = bin: 1110.1011                                      
Bitset(235, 3, 4) Resultado 13  
marcando la separacion de bits filtrados: 1'1101'011
Los 3 bits de menor peso, se pierden al dividir por 8.
El bit alto se pierde al enmascarar con 15: (11101 and 1111)

p.d.: en tu caso como precisas los bits 5 y 6

Código:
...
avr = bitSet(valor, 5,2)
   
Si (avr= 0)  // o un switch...
    normal
O si (avr= 1)
    boost one stage
O Si (avr= 2)
    boost two stages
Y Si No  // 3
    buck one stag
fin si


« Última modificación: 20 Abril 2021, 15:57 pm por Serapis » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Indicar bien valores de un Byte en concreto
« Respuesta #2 en: 20 Abril 2021, 18:32 pm »

Gracias por la idea, voy a probar a ver. Después comento.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
indicar los dias de cada mes c++
Programación C/C++
fralem15 4 3,883 Último mensaje 3 Mayo 2011, 20:09 pm
por satu
[Sources Code] RotBits [Byte TO Byte ]
Programación Visual Basic
x64core 8 5,707 Último mensaje 22 Octubre 2011, 00:46 am
por BlackZeroX
Filestream . Byte a Byte
.NET (C#, VB.NET, ASP)
blaron 3 3,286 Último mensaje 5 Abril 2014, 02:01 am
por Eleкtro
Suma byte a byte con acarreo en variable de 2 bytes
Programación C/C++
AlbertoBSD 2 4,392 Último mensaje 18 Mayo 2016, 18:21 pm
por AlbertoBSD
Indicar nombre a registros de una consulta
Bases de Datos
Brian1511 3 2,590 Último mensaje 27 Junio 2018, 15:15 pm
por Hadess_inf
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines