Я знаю, что есть много вопросов, связанных с этим, но все же они не решают мою проблему. Ниже мой байтовый массив:

screenshot

Как вы можете видеть, байт имеет значение 28, и каждое значение 4-byte представляет одно значение, т.е. у меня есть клиентский компьютер, который отправил мне 2.4, и при его чтении оно затем преобразуется в байтов.

//serial port settings and opening it
        var serialPort = new SerialPort("COM2", 9600, Parity.Even, 8, StopBits.One);

        serialPort.Open();

        var stream = new SerialStream(serialPort);
        stream.ReadTimeout = 2000;
        // send request and waiting for response
        // the request needs: slaveId, dataAddress, registerCount            
        var responseBytes = stream.RequestFunc3(slaveId, dataAddress, registerCount);

        // extract the content part (the most important in the response)
        var data = responseBytes.ToResponseFunc3().Data;

Что я хочу делать?

  1. Преобразуйте каждые 4 байта один за другим в шестнадцатеричный, сохраните их в отдельной переменной. Нравиться hex 1 = byte[0], hex2 = byte[1], hex3 = byte[2], hex4 = byte[3] ..... hex28 = byte[27]

  2. Объедините 4-байтовые шестнадцатеричные значения, затем преобразуйте их в числа с плавающей запятой и назначьте им переменную для хранения плавающего значения. Нравиться v1 = Tofloat(hex1,hex2,hex3,hex4); // предполагаем, что ToFloat () - это функция.

Как я могу этого добиться?

0
Moeez 16 Апр 2020 в 08:28

1 ответ

Лучший ответ

Поскольку вы упомянули, что первое значение - 2,4, и каждое число с плавающей запятой представлено 4 байтами;

byte[] data = { 64, 25, 153, 154, 66, 157, 20, 123, 66, 221, 174, 20, 65, 204, 0, 0, 65, 163, 51, 51, 66, 95, 51, 51, 69, 10, 232, 0 };

Мы можем сгруппировать байты в блоки по 4 байта, перевернуть их и преобразовать каждую часть в плавающую, например:

int offset = 0;
float[] dataFloats =
    data.GroupBy(x => offset++ / 4) // group by 4. 0/4 = 0, 1/4 = 0, 2/4 = 0, 3/4 = 0 and 4/4 = 1 etc.
    // Need to reverse the bytes to make them evaluate to 2.4
    .Select(x => BitConverter.ToSingle(x.ToArray().Reverse().ToArray(), 0))
    .ToArray();

Теперь у вас есть массив из 7 чисел с плавающей запятой:

enter image description here

2
Oguz Ozgul 16 Апр 2020 в 06:22