Работа с байтами через union
Ниже даны два примера, в котором показывается как можно работать с отдельными байтами значений стандартных типов float и int. Работа происходит путем применения конструкции union.
Данный код побайтно создает некое значение в виде массива байт m[], и получает значение типа float или int из этого байтного представления.
Внимание! Данный код чуствителен к порядку следования байт в архитектуре.
float UniModbus::getFloat(QByteArray &package)
{
typedef union
{
float value;
uchar m[4];
} conv;
conv converter;
converter.m[0] = QString(package.mid(0, 2)).toInt(0, 16);
converter.m[1] = QString(package.mid(2, 2)).toInt(0, 16);
converter.m[2] = QString(package.mid(4, 2)).toInt(0, 16);
converter.m[3] = QString(package.mid(6, 2)).toInt(0, 16);
// Во входном массиве убираются обработанные байты (
package = package.mid(8);
return converter.value;
}
int UniModbus::getInt(QByteArray &package)
{
typedef union
{
int value;
uchar m[4];
} conv;
conv converter;
converter.m[0] = QString(package.mid(6, 2)).toInt(0, 16);
converter.m[1] = QString(package.mid(4, 2)).toInt(0, 16);
converter.m[2] = QString(package.mid(2, 2)).toInt(0, 16);
converter.m[3] = QString(package.mid(0, 2)).toInt(0, 16);
// Во входном массиве убираются обработанные байты
package = package.mid(8);
return converter.value;
}