Чтение байтового массива и преобразование в число с плавающей точкой в ​​C# - PullRequest
0 голосов
/ 16 апреля 2020

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

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 () является функцией.

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

1 Ответ

2 голосов
/ 16 апреля 2020

Поскольку вы упомянули, что первое значение равно 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

...