LINUX.ORG.RU

История изменений

Исправление bormant, (текущая версия) :

Вот кусок спека:

Числа идут по 3 беззнаковых байта в big endian (старший, средний, младший). Числа положительные беззнаковые. Преобразуется так: делаем из этих 3 байтов unsigned int (последний байт - 0x00). Значение отсчёта умножаем на цену деления (2.5v/0xFFFFFF) и вычитаем середину шкалы (1.25v).

Всё ещё считаешь, что код неверен?
const quint32 block = (b1 << 16U) | (b2 << 8U) | b3;

Если я правильно понял спеку, то из 0x12, 0x34, 0x56 должно получиться ЗНАЧЕНИЕ 0x12345600 (последний байт 0 в big endian — это младший байт), тогда
const quint32 block = (b1 << 24) | (b2 << 16) | (b3 << 8);

Если в спеке имелся в виду последний байт после конвертации в little-endian (это старший байт) и получить нужно ЗНАЧЕНИЕ 0x00123456, то сдвиги 16/8/0.

В стартовом посте темы BE и LE фрагменты кода были не синхронны между собой, поэтому в своих примерах в отсутствие цитаты из спеки брал за основу LE вариант.

Исходная версия bormant, :

Вот кусок спека:

Числа идут по 3 беззнаковых байта в big endian (старший, средний, младший). Числа положительные беззнаковые. Преобразуется так: делаем из этих 3 байтов unsigned int (последний байт - 0x00). Значение отсчёта умножаем на цену деления (2.5v/0xFFFFFF) и вычитаем середину шкалы (1.25v).

Всё ещё считаешь, что код неверен?
const quint32 block = (b1 << 16U) | (b2 << 8U) | b3;

Если я правильно понял спеку, то из 0x12, 0x34, 0x56 должно получиться 0x12345600 (последний байт 0 в big endian — это младший байт), тогда
const quint32 block = (b1 << 24) | (b2 << 16) | (b3 << 8);

Если в спеке имелся в виду последний байт после конвертации в little-endian (это старший байт) и получить нужно 0x00123456, то сдвиги 16/8/0.

В стартовом посте темы BE и LE фрагменты кода были не синхронны между собой, поэтому в своих примерах в отсутствие цитаты из спеки брал за основу LE вариант.