【问题标题】:how to convert 3 bytes in little endian order to a floating number from -1 to +1如何以小端顺序将3个字节转换为从-1到+1的浮点数
【发布时间】:2019-05-22 10:15:23
【问题描述】:

我有 3 个字节的小端序。 它们是:顶部、中间和底部(从位 23 到位 0) 如何将它们转换为从 -1 到 +1 的浮点数?

3 个字节是 little-endian,因为 wav 中有字符串 RIFF 所以最小值是(0x7FFFFF),最大值是(0x800000)

http://www.labbookpages.co.uk/audio/javaWavFiles.html

对于 16 位 wav:波形帧为 -32768 之间的 2s 互补二进制; 0x8000 和 32767; 0x7FFF)

【问题讨论】:

  • 这不是标准格式。您需要知道浮点值是如何编码的。只有你自己能确定。
  • 来自 24 位 wav 的 3 字节数据。 labbookpages.co.uk/audio/javaWavFiles.html这3个字节是little-endian ..描述符中有RIFF
  • 请在问题中提供此信息
  • 那个链接对我来说不太有意义。我不明白范围从何而来,它们与我对 24 位二进制补码算术的理解不符。

标签: numbers lazarus floating 24-bit


【解决方案1】:

您提供的链接在我看来是错误的。当然,24 位格式使用标准two's complement arithmetic。在这种情况下,0x7FFFFF 代表 -83886080x800000 代表 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 个字节使用了无类型参数,但您可能希望根据您读取数据的方式不同来执行此操作。

此外,这段代码是在假设它运行在小端机器上的情况下编写的。如果数据是小端,而机器是大端,则需要将每组三个字节反转。

【讨论】:

  • 好的,这些作品。并在操纵浮点数后取回 3 个字节?
  • 做相反的操作
  • 函数 MyToByteL(fl : extended):longint; var ret1 : longint; var retval2:扩展;开始 ret1 := 0; ret1 := 0; retval2 := fl; retval2 := round(retval2 * 8388608); ret1 := 圆形(retval2); ret1 := (ret1 和 $7fffff) -(ret1 和 $800000);结果:= ret1;结尾;它不起作用
  • 不,32位二进制补码和24位二进制补码之间的转换是错误的。我们不能在 cmets 中这样做。需要一个新的问题。我确实认为我已经回答了这个问题,并且您可以接受这个答案。
  • 我无法打开另一个问题。我该怎么办?
猜你喜欢
  • 2019-08-04
  • 2022-11-28
  • 2013-12-30
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多