QByteArray 转QVector<double >
时间: 2023-12-04 10:05:10 浏览: 35
可以使用QDataStream来实现QByteArray到QVector<double>的转换。具体实现可以参考下面的代码:
```cpp
QByteArray byteArray = ...; // 待转换的QByteArray
QVector<double> vector;
QDataStream stream(&byteArray, QIODevice::ReadOnly);
while (!stream.atEnd()) {
double value;
stream >> value;
vector.append(value);
}
```
这段代码中,我们首先创建了一个QByteArray对象byteArray,然后创建了一个QDataStream对象stream,将其绑定到byteArray上,并且设置其为只读模式。
接下来,我们通过一个while循环,从stream中不断读取double类型的数据,并且将其添加到QVector<double>对象vector中。
最终,vector中就存储了从QByteArray转换而来的double类型的数据。
相关问题
QByteArray 里面是二进制float数据 转QVector<double >
如果QByteArray里面存储的是二进制float数据,我们需要先将其转换成double类型的数据,然后再将其添加到QVector<double>中。
具体实现可以参考下面的代码:
```cpp
QByteArray byteArray = ...; // 待转换的QByteArray
QVector<double> vector;
const int size = sizeof(float); // float类型的数据占用字节数
for (int i = 0; i < byteArray.size(); i += size) {
float floatValue;
memcpy(&floatValue, byteArray.constData() + i, size);
double doubleValue = static_cast<double>(floatValue);
vector.append(doubleValue);
}
```
这段代码中,我们首先创建了一个QByteArray对象byteArray,然后创建了一个QVector<double>对象vector。
接下来,我们通过一个for循环,每次从byteArray中读取一个float类型的数据,将其转换成double类型的数据,并且将其添加到QVector<double>对象vector中。在读取float类型的数据时,我们使用memcpy函数将byteArray中的数据复制到一个float类型的变量中。
最终,vector中就存储了从QByteArray转换而来的double类型的数据。
QT通过信号获取包络数据
在QT中,可以通过信号获取包络数据。一般情况下,可以使用QAudioInput类来获取音频输入,并通过其readyRead()信号来获取采样数据。然后,可以通过FFT等算法来计算包络数据。
示例代码如下:
```cpp
#include <QAudioInput>
#include <QIODevice>
#include <QAudioFormat>
#include <QAudioDeviceInfo>
#include <QByteArray>
#include <qmath.h>
// 定义采样率、声道数、采样位数等参数
const int sampleRate = 48000;
const int channelCount = 1;
const int sampleSize = 16;
const QAudioFormat::Endian byteOrder = QAudioFormat::LittleEndian;
const QAudioFormat::SampleType sampleType = QAudioFormat::SignedInt;
// 定义FFT长度
const int fftLength = 4096;
class AudioInput : public QIODevice
{
Q_OBJECT
public:
AudioInput(QObject *parent = nullptr) : QIODevice(parent) {
// 设置音频输入参数
QAudioFormat format;
format.setSampleRate(sampleRate);
format.setChannelCount(channelCount);
format.setSampleSize(sampleSize);
format.setByteOrder(byteOrder);
format.setSampleType(sampleType);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
qDebug() << "Unsupported format!";
return;
}
// 创建音频输入
audioInput = new QAudioInput(info, format, this);
audioInput->setBufferSize(fftLength * 2); // 缓冲区大小为FFT长度的两倍
// 连接信号
connect(audioInput, SIGNAL(readyRead()), this, SLOT(readData()));
}
~AudioInput() {
delete audioInput;
}
qint64 readData(char *data, qint64 maxlen) {
Q_UNUSED(data);
Q_UNUSED(maxlen);
return 0;
}
qint64 writeData(const char *data, qint64 len) {
// 将采样数据存储到缓冲区中
buffer.append(data, len);
// 计算包络数据
while (buffer.size() >= fftLength * 2) {
// 读取数据
QByteArray data = buffer.left(fftLength * 2);
buffer = buffer.mid(fftLength * 2);
// 将数据转换为复数数组
QVector<qint16> samples = data.mid(0, fftLength * 2).toVector<qint16>();
QVector<qcomplex> complexSamples;
for (int i = 0; i < fftLength; i++) {
complexSamples.append(qcomplex(samples[i], 0));
}
// 进行FFT变换
QVector<qcomplex> spectrum = FFT::fft(complexSamples);
// 计算包络数据
QVector<double> envelope(fftLength / 2);
for (int i = 0; i < fftLength / 2; i++) {
double re = spectrum[i].real();
double im = spectrum[i].imag();
envelope[i] = qSqrt(re * re + im * im);
}
// 发送信号
emit envelopeData(envelope);
}
return len;
}
signals:
void envelopeData(QVector<double> envelope);
private:
QAudioInput *audioInput;
QByteArray buffer;
};
```
在上述示例代码中,我们创建了一个名为AudioInput的类,继承自QIODevice,并通过QAudioInput类获取音频输入。在writeData()函数中,我们将采样数据存储到缓冲区中,并在缓冲区中有足够的数据时,计算包络数据,并通过envelopeData()信号发送包络数据。在使用时,只需要连接envelopeData()信号即可获取包络数据。