将uint8_t *转换为char *以与QIODevice一起使用

时间:2012-04-24 13:12:27

标签: c++ qt pointers io buffer

我正在修改Qt Audio Output example,如下所示:

  • 我可以从第三方访问音频混音器API。
  • 从此调音台读取数据的方法是void AudioMixer::ReadData(uint8_t *stream, uint32_t len);
  • 我要更改以在示例中输出此数据的功能是qint64 Generator::readData(char *data, qint64 len)

如果我的理解是正确的,我应该能够通过覆盖QIODevice方法以推送方式操作Generator::readData以调用AudioMixer::ReadData方法并投射uint8_t* } AudioMixer用于char*用于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;
}

1 个答案:

答案 0 :(得分:6)

在C ++中没有表示“byte”的本机类型,只保证char只能保存一个字节。对于表示原始二进制数据的字节类型是否应该签名,有不同的意见,因此有些使用unsigned charuint8_t)而其他人使用普通char。最后,它并不重要,因为您通常不对二进制数据执行算术运算,而只是读取和解释它。

因此,您可以使用类型转换来在不同的二进制数据表示之间进行转换。由于这是C ++,你应该使用reinterpret_cast(支持C风格的转换):

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

是否使用reinterpret_cast或C风格的演员表明显有争议。 C ++的创造者Bjarne Stroustrup会certainly advocate reinterpret_cast,但其他人不喜欢它,那没关系。