Ссылка, которую вы предоставляете, выглядит для меня неправильно. Конечно, 24-битный формат использует стандартную арифметику с двумя дополнениями . В этом случае 0x7FFFFF
представляет -8388608
и 0x800000
представляет 8388607
.
На этой основе вы используете эту функцию для преобразования трех байтов в целочисленное значение со знаком:
function TwosComplement24(const Bytes): Integer;
begin
Result := 0;
Move(Bytes, Result, 3);
Result := (Result and $7fffff) - (Result and $800000);
end;
Если у вас есть это, вы можете преобразовать его в значение с плавающей запятой, например:
function Sample24toReal(const Bytes): Double;
begin
Result := TwosComplement24(Bytes) / 8388608;
end;
Я использовал нетипизированный параметр для 3 байтов, но вы можете сделать это по-разному в зависимости от того, как вы читаете данные.
Кроме того, этот код написан при условии, что он работает на машине с прямым порядком байтов. Если для данных используется прямой порядок байтов, а для машины - прямой порядок байтов, то вам нужно будет перевернуть каждую группу из трех байтов.