Parcando una cadena C # que representa un mensaje de 'longitud fija' con campos de diferentes tamaños

Tengo un mensaje de cadena de longitud fija en un aspecto similar a este:

"\0\0\0j\0\0\0\vT3A1111        2999BOSH                          2100021        399APV                           2100022  "

Este mensaje se crea a partir de mí leyendo un byte [] en un StringBuilder para construir una cadena.

Arriba, porción de cadena "\0\0\0j\0\0\0\ve supone que @ "son campos LENGTH e ID, ambos de 4 bytes de longitud. Sin embargo, no estoy seguro de cómo extraer estos 2 valores, pero puedo ver queHEX 0j es 106 (1 + 1 + 8 + 9 + 30 + 9 + 9 + 30 + 9 = 106 de longitud total). No estoy seguro de por qué la "v" no es "0v" arriba, pero sé que se supone que es un valor HEX que representa la identificación del mensaje.

Primero 2 los campos de longitud 4 son HEX, todos los demás son ASCII.

Este no es un mensaje EDI (por lo que no puedo usar la biblioteca de analizadores EDI) y, a diferencia de los mensajes EDI que tienen algún tipo de identificador de campo, solo tengo una secuencia de bytes y solo sé la longitud de los campos. Los campos son:

4  byte long message length      ("\0\0\0j")
4  byte long message id          ("\0\0\0\v")
1  byte long message type        ("T")
1  byte long message sequence    ("3")
8  byte long car Id              ("A1111   ")  
9  byte long part-1 price        ("     2999")
30 byte long part-1 manufacturer ("BOSH                          ")
9  byte long part#               ("2100021  ")
9  byte long part-2 price        ("      399")
30 byte long part-2 manufacturer ("APV                           ")
9  byte long part#               ("2100022  ")

Entonces, arriba tengo 2 partes hechas por 2 fabricantes, pero en un ejemplo real, podrían ser más partes que solo 2:

Part 1, 29.99, made by Bosh, part# 2100021
Part 2, 3.99, made by APV, part# 2100022

Me gustaría obtener todos los campos de precio y fabricante de esta cadena de archivo plano en una Lista de objetos donde Parte es

class Part
{
   public decimal Price {get; set}
   public string Manufacturer {get; set;}
   public string PartNumber {get; set;}
}

Entonces, mi Lista contendría todas las partes con sus precios y fabricantes.

Dado que tengo longitudes de cada campo, sé que podría recorrer esta cadena y obtener los datos relacionados con la Parte. Pero me pregunto si hay una manera más elegante y fácil de hacer esto.

O incluso mejor, ¿hay una biblioteca de código abierto que me permita analizar algo como esto?

Recibo este mensaje usando este método

private TcpClient clientSocket;
private NetworkStream serverStream;

private async System.Threading.Tasks.Task ReadResponseAsync()
{
    if (serverStream.CanRead)
    {
        byte[] readBuffer = new byte[1024];
        StringBuilder receivedMessage = new StringBuilder();
        int readSoFar = 0;

        do
        {
            readSoFar = await serverStream.ReadAsync(readBuffer, 0, readBuffer.Length);
            receivedMessage.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, readSoFar));
        } 
        while (serverStream.DataAvailable);

        string msg = receivedMessage.ToString();
    }
    else
    {
        Log("Error", "Cannot read from NetworkStream");
    }
}

@ Enigmativity: intenté publicar tu respuesta y ejecutarla en LinqPad (nunca la usé, solo la descargué e instalé), pero no veo la estructura de tabla que publicaste en tu respuesta. ¿Cómo se consigue eso?

Aquí es lo que obtengo

Respuestas a la pregunta(2)

Su respuesta a la pregunta