MyTetra Share
Делитесь знаниями!
Примеры работы с байтами через union и через memcpy
Время создания: 29.12.2020 17:25
Текстовые метки: язык, С, С++, Си, Си++, байт, значение, разбор, доступ, memcpy, union
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/1609251915348uyqzymj/text.html на raw.github.com

Работа с байтами через 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;

}



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования