【问题标题】:How to read signed 16bit integers from QFile?如何从 QFile 中读取带符号的 16 位整数?
【发布时间】:2015-06-26 18:19:58
【问题描述】:

我想从 Qt 中的音频文件中读取 16 位整数样本值。

char tempbytes[3]; /// 
int sampleposition;
int sample;

QFile file(sourcepath);

if (! file.open(QIODevice::ReadOnly | QIODevice::Text)) return;

sampleposition = 120
file.seek(sampleposition );
file.read(tempbytes, 2);   

现在我有一个 char 数组,但我想将它转换为 16 位有符号整数值。 wave 文件中的字节顺序是 littleendian。

我已经试过了:

sample = qFromLittleEndian<qint16>((uchar*)tempbytes);

这适用于一些样本,但有些样本被完全误解为错误的值。我比较了大胆的时间信号图。

有没有更好的办法?

【问题讨论】:

  • 你得到错误值的原因是因为表达式(uchar*)tempbytes返回了tempbytes的内存地址。因此,您获得的值是地址,而不是音频样本。

标签: c++ qt c++11


【解决方案1】:

无论它是否是“更好”的解决方案,我发现在这些类型的情况下使用QDataStream 更简单。它特别具有reading 16-bit integers 的重载。

这是一个非常基本的例子:

// Open the file and create our data stream
QFile file("filename");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in.setByteOrder(QDataStream::LittleEndian);

// Read a 16-bit sample
qint16 sample;
in >> sample

【讨论】:

    【解决方案2】:

    源文件不是文本文件,所以不要这样对待它。正确的打开方式是:

    if (! file.open(QIODevice::ReadOnly)) return;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2012-04-01
      • 1970-01-01
      • 2023-03-19
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多