¿Cómo establecer rangos de entrada hexadecimal para diferentes segmentos en un mensaje de datos?

A 24 entradas de mensaje de bytes hexadecimales: xx xx xx xx xx xx xx xx xx xx xx xx

Tengo una entrada de mensaje de 24 bytes hexadecimales en un cuadro de texto con diferentes requisitos de entrada de segmentos de bytes, ¿hay un código de plantilla para que pueda codificar dinámicamente el rango del valor hexadecimal que necesito para cada segmento, por ejemplo, 1, 4?

Intenté el código a continuación, pero no es lo que quería, ya que convierte la entrada hexadecimal completa en int equivalente sin darme la libertad de codificar el rango que quería.

 outputTxt.Text = String.Join(" ", hexTextBox.Text.Trim().Split(' ').Select(item => Convert.ToInt32(item, 16))); 

Por ejemplo, el primer grupo de 2 valores hexadecimales ingresados ​​en el cuadro de texto, una función para verificar el valor hexadecimal ingresado está entre 0 y 100 en uint antes de convertirlo en su equivalente decimal en el cuadro de texto de salida, de lo contrario, mostrará la pantalla de ‘Error’ en el cuadro de texto de salida.

Posteriormente, en los siguientes 4 bytes, solo permito 4 bytes de entradas hexadecimales en el rango entre -1000 y 1000 en el mensaje de error “int” de otro modo.

EDITAR: Perdón por la confusión en la forma en que expreso mis oraciones anteriormente, ya que los 5 bytes son solo una representación en bytes de un carácter ASCII para cada byte con un rango de 0 a 255. ¿Cómo codificar estos diferentes casos? ¡Gracias!

 uint value1 = reader.ReadByte(); // 1 byte. if (value1 ==700) { OutputTxt.Text = value1.ToString(); OutputTxt.Text +="\n"; } else { OutputTxt.Text = "Error" OutputTxt.Text +="\n"; } uint value2 = reader.ReadByte(); // 1 byte. if (value2 <=1000) { OutputTxt.Text += value2.ToString(); OutputTxt.Text +="\n"; } else { OutputTxt.Text += "Error" OutputTxt.Text += "\n"; } 

Sé que esto podría ser un error simple, pero no puedo averiguar la syntax correcta para evitar volver a actualizar mi primer cuadro de texto de bytes después de ejecutar la segunda validación de lectura de bytes ().

Creo que tu mejor apuesta es hacer algo como esto:

  1. Convertir la cadena hexadecimal en una matriz de bytes.
  2. Use MemoryStream para envolver la matriz y pasarla a un BinaryReader para permitir una lectura más fácil de los datos.
  3. Escriba un método personalizado que lea los valores requeridos de la secuencia y valide los valores leídos.

El único bit difícil es analizar un conjunto de bytes que no es el tamaño normal para un tipo integral, por ejemplo, 5 bytes.

La solución para ese caso es prefijar los 5 bytes con 3 bytes cero y luego usar BitConverter para convertir eso en un long . Por ejemplo:

 public static long LongFromBytes(byte[] bytes) { // This uses little-endian format. If you're expecting bigendian, you // would need to reverse the order of the bytes before doing this. return BitConverter.ToInt64(bytes.Concat(new byte[8-bytes.Length]).ToArray(), 0); } 

Un método adecuado para convertir su cadena hexadecimal (con espacios) en una matriz de bytes es:

 public static byte[] StringToByteArray(string hex) { hex = hex.Trim().Replace(" ", ""); return Enumerable.Range(0, hex.Length) .Where(x => x % 2 == 0) .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) .ToArray(); } 

Ahora puedes poner estas cosas juntas para validar los valores en tu cadena hexadecimal:

 string hexString = "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18"; using (var stream = new MemoryStream(StringToByteArray(hexString))) using (var reader = new BinaryReader(stream)) { int value1 = reader.ReadByte(); // 1 byte. Console.WriteLine(value1); int value2 = reader.ReadByte(); // 1 byte. Console.WriteLine(value2); int value3 = reader.ReadInt32(); // 4 bytes. Console.WriteLine(value3); long value4 = LongFromBytes(reader.ReadBytes(5)); // 5 bytes into a long. Console.WriteLine(value4); } 

Una vez que haya leído los valores, puede validarlos según sea necesario.