Создание новой переменной из списка байтов - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь написать GUI регистратора данных.Это приложение получает информацию через последовательный порт о переменных, которые определены во встроенном программном обеспечении.

У меня есть класс для хранения этих переменных.Новый экземпляр этого класса создается каждый раз, когда в окне наблюдения запрашивается новая переменная.

public class Var_t
{
    public string vType;    //variable type chosen from a combobox      
    public string vName;    //variable name read from the serial port
    public UInt32 vAddr;    //variable ram addr read from the serial port
    public byte vSize;      //variable size read from the serial port
    public List<byte> vBuffer;    //variable content buffer  
};

Поскольку размер и тип переменной читаются динамически во время выполнения, я просто заполняю byteList при получении значения этой переменной.

Мне нужен класс, который объединяет эти байты, используя тип данных vType после завершения передачи.Этот класс вернет строку, чтобы я мог показать пользователю значение переменной в поле со списком:

public class BuildVariable(List<byte> varBuf, string varType)
{
    string ValueStr;

    //I tried using BitConverter to combine the bytes into a new object 
    //but it does not accept any parameter for the type

    return ValueStr;
};

Возможные типы переменных: byte, uint8, int8, uint16, int16, uint32, int32, uint64, int64, float, double, char, string

1 Ответ

0 голосов
/ 20 ноября 2018

Вот что я закончил:

public static string GetTypedString(Var_t varToDisp)
{
    string ValueDisplay;

    switch (varToDisp.vType)
    {
        case "byte":

            lock (varToDisp.value)
            {
                byte temp_byte = varToDisp.vBuffer[0];
                ValueDisplay = temp_byte.ToString();
            }
            break;

        case "uint16":

            lock (varToDisp.value)
            {
                UInt16 temp_ui16 = BitConverter.ToUInt16(varToDisp.vBuffer.ToArray<byte>(), 0);
                ValueDisplay = temp_ui16.ToString();
            }
            break;

        case "uint32":

            lock (varToDisp.value)
            {
                UInt32 temp_uint32 = BitConverter.ToUInt32(varToDisp.vBuffer.ToArray<byte>(), 0);
                ValueDisplay = temp_uint32.ToString();
            }
            break;

        //and so on..
    }

    return ValueDisplay;
}

Я не смог найти способ сделать это с помощью динамического выбора типа, поэтому мне пришлось выполнять преобразование по одному.

...