将uint8_t*转换为char*,用于QIODevice。

问题描述 投票:1回答:1

我正在修改 Qt音频输出示例 如下。

  • 我从第三方获得了一个音频混合器的API。
  • 从这个混音器读取数据的方法是 void AudioMixer::ReadData(uint8_t *stream, uint32_t len);
  • 我在例子中改变了输出这些数据的函数是 qint64 Generator::readData(char *data, qint64 len)

如果我的理解是正确的,我应该可以操作的是 QIODevice 在推送模式下,通过覆盖 Generator::readData 方法来调用 AudioMixer::ReadData 方法,并投下 uint8_t* 所用 AudioMixerchar* 搭配使用 QIODevice.

我的想法是否正确,这在某种程度上是可能的?如果是的话,谁能告诉我如何进行施放?如果没有,你能不能解释一下如何输出的是 uint8_t* 使用 QIODevice?

为完整起见,方法是:?

void AudioMixer::ReadData(uint8_t *stream, uint32_t len)
{   
    if(buffer.GetMaximumReadSize() < len)
    {
        memset(stream, 0, len);
    }
    else
    {
        buffer.Read(stream, len);
    }
}

qint64 Generator::readData(char *data, qint64 len)
{
    qint64 total = 0;
    while (len - total > 0) {
        const qint64 chunk = qMin((m_buffer.size() - m_pos), len - total);
        memcpy(data + total, m_buffer.constData() + m_pos, chunk);
        m_pos = (m_pos + chunk) % m_buffer.size();
        total += chunk;

        // Need to call AudioMixer::readData in here
    }
    return total;
}
c++ qt pointers io buffer
1个回答
8
投票

在C++中没有原生类型来表示 "字节",只有 char 的,保证正好可以容纳一个字节。 用来表示原始二进制数据的字节类型是否应该有签名有不同的意见,所以有的人用 unsigned char (uint8_t),其他则使用普通的 char. 最后,这其实并不重要,因为你通常不会对二进制数据进行算术运算,而只是读取和解释它。

因此,你可以使用类型转换来转换不同的二进制数据表示。 由于这是C++,你应该使用 reinterpret_cast (有利于C型铸型)。

char* dst = reinterpret_cast<char*>(/* your uint8_t* expression */);

是否使用 reinterpret_cast 或C-风格的casts显然是有争议的。 Bjarne Stroustrup,C++的创造者,会在他看来 当然主张 reinterpret_cast但别人不喜欢,也没关系。

© www.soinside.com 2019 - 2024. All rights reserved.