微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中的信号处理

如何解决C中的信号处理

有一段反编译的 C 代码在这部分程序中,处理来自 wav 文件的数据。我可以假设这是信号归一化,但是划分为 4 个不同数组的目的是什么?然后代码只适用于 v69 数组。为什么将每个字节乘以 0.0078125? 请帮助我理解这段代码的作用!

CStdioFile::Read((CStdioFile *)&v54,v14,v13);
v15 = 0;
if ( v13 >= 4 )
{
  do
  {
    v16 = (char)(*((_BYTE *)v14 + v15 + 1) ^ 0x80);
    v17 = *((_BYTE *)v14 + v15 + 2);
    *(&v69 + v15) = (double)(char)(*((_BYTE *)v14 + v15) ^ 0x80) * 0.0078125;
    v18 = (double)v16 * 0.0078125;
    v19 = (char)(v17 ^ 0x80);
    v20 = *((_BYTE *)v14 + v15 + 3);
    *(&v70 + v15) = v18;
    v71[v15] = (double)v19 * 0.0078125;
    v15 += 4;
    *(&v68 + v15) = (double)(char)(v20 ^ 0x80) * 0.0078125;
  }
  while ( v15 < v13 - 3 );
}
for ( ; v15 < v13; *(&v68 + v15) = (double)v21 * 0.0078125 )
  v21 = (char)(*((_BYTE *)v14 + v15++) ^ 0x80);
j__free(v14);

解决方法

显然这些值属于 signed char 类型,该方法将它们映射到从 -1 到 +1 的范围。

0.0078125 是 128 的倒数。

A signed char 的范围从 -128 到 +127。将此范围的值乘以 0.0078125 会得到 -1 到 +1 范围内的值。当然不可能完全变成+1,最大值是+127 * 0.0078125 ≈ 0.9922。

无需深入研究,0x80 的 XOR 可能会处理符号位,假设二进制补码与 signed char 一起使用。

,

当您反编译一些像这样的代码时,请始终指明您使用的操作系统,因为它不包含上下文信息。

这里反编译的是C++而不是普通的C。不同的数组可以包含许多与您的数据没有直接关系的信息(例如,虚拟成员函数的地址)。

但是,

0.0078125 作为 double 解析为 3F80000000000000,这很可能是某些内存映射系统中的基地址。编译后,类型信息将丢失,所有内容最终都会进入 CPU 寄存器之一。在这里使用 double 是反编译器最好的猜测,也是写下这个特定值的最简洁的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。