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

C++ 将uint8_t*转换为char*以便与QIODevice一起使用,c++,qt,pointers,io,buffer,C++,Qt,Pointers,Io,Buffer,我正在修改以下内容: 我可以从第三方访问音频混音器API 从该混音器读取数据的方法是void AudioMixer::ReadData(uint8_t*stream,uint32_t len) 在示例中,我正在更改以输出此数据的函数是qint64生成器::readData(char*data,qint64 len) 如果我的理解是正确的,我应该能够通过覆盖Generator::readData方法来调用AudioMixer::readData方法,并将AudioMixer使用的uint8*转

我正在修改以下内容:

  • 我可以从第三方访问音频混音器API
  • 从该混音器读取数据的方法是
    void AudioMixer::ReadData(uint8_t*stream,uint32_t len)
  • 在示例中,我正在更改以输出此数据的函数是
    qint64生成器::readData(char*data,qint64 len)
如果我的理解是正确的,我应该能够通过覆盖
Generator::readData
方法来调用
AudioMixer::readData
方法,并将
AudioMixer
使用的
uint8*
转换为
char*
,以便与
QIODevice
一起使用,从而在推送模式下操作
QIODevice

我认为这是可能的,对吗?如果是这样的话,有人能就如何进行演员阵容提供建议吗?如果没有,您能否解释如何使用
QIODevice
输出
uint8\u t*

为完整起见,方法如下:

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

没有表示C++中的“字节”的本机类型,只有“代码> char < /C> >,它保证只保存一个字节。对于表示原始二进制数据的字节类型是否应该有符号,存在不同的意见,因此一些使用

无符号字符
uint8_t
),而另一些使用纯
字符
。最后,这并不重要,因为您通常不对二进制数据执行算术运算,而只是读取和解释它


因此,您可以使用类型转换在不同的二进制数据表示形式之间进行转换。因为这是C++,所以你应该使用<代码> RealTytCase< /Cult>(有利于C样式的case:

char*dst=reinterpret_cast(/*您的uint8_t*表达式*/);

显然,是使用
reinterpret\u cast
还是C风格的cast存在争议。Bjarne Stroustrup,C++的创建者,但是其他人不喜欢它,这没关系。

< P>没有表示C++中的“字节”的本机类型,只有<代码> char < /> >保证了一个字节。对于表示原始二进制数据的字节类型是否应该有符号,存在不同的意见,因此一些使用
无符号字符
uint8_t
),而另一些使用纯
字符
。最后,这并不重要,因为您通常不对二进制数据执行算术运算,而只是读取和解释它


因此,您可以使用类型转换在不同的二进制数据表示形式之间进行转换。因为这是C++,所以你应该使用<代码> RealTytCase< /Cult>(有利于C样式的case:

char*dst=reinterpret_cast(/*您的uint8_t*表达式*/);

显然,是使用
reinterpret\u cast
还是C风格的cast存在争议。Bjarne Stroustrup,C++的创建者,但是其他人不喜欢它,这没什么。字符*b=(字符*)a;真的这么简单吗?因为
char
本质上是有符号的,所以没有潜在的问题吗?只有在执行位移位操作时,符号性(缺少更好的词)才应该相关。如果向右移动,无符号变量将始终用0填充,则有符号变量将根据值的不同用1或0填充。uint8_t*a;字符*b=(字符*)a;真的这么简单吗?因为
char
本质上是有符号的,所以没有潜在的问题吗?只有在执行位移位操作时,符号性(缺少更好的词)才应该相关。如果向右移动,无符号变量将始终用0填充,有符号变量将根据值的不同用1或0填充。无论是否需要,请停止按reinterpret_cast。重新插入。。。。需要大量的键入,在本例中,这完全等同于旧的良好C转换。在某些情况下,它在运行时(即vtable偏移)或帮助类型安全(非故意的错误类型转换)中确实很重要。但实际上,你必须理解它,而不是仅仅因为它看起来更像C而有一个愚蠢的规则说-type more“应该使用”不,你不应该。您“应该”使用最简单正确的解决方案。在这种情况下,是C样式的。<代码> RealTytCase<代码>是有原因的,并且许多C++编码准则清楚地表明,您应该更喜欢C风格的转换上的新样式。我不知道你为什么在这里对此大惊小怪。是的,它很长(比亚恩·斯特劳斯图普说这是“一个丑陋的操作的丑陋符号”),但别这样,它没那么难打字。@VladLazarenko——我只是想说清楚:我不是想批评你的评论,只是想回答这个问题。这里不是重点,是使用C样式还是新样式转换。问题的答案是:只需使用类型转换。我不赞成重新解释cast,因为它“看起来不像C”,但因为这只是C++的方式(Stroustrup甚至说,如果可能的话,他会一起“禁止C风格的强制转换”。不管是否需要重新解释cast,都不要推它。重新插入。。。。需要大量的键入,在本例中,这完全等同于旧的良好C转换。在某些情况下,它在运行时(即vtable偏移)或帮助类型安全(非故意的错误类型转换)中确实很重要。但实际上,你必须理解它,而不是仅仅因为它看起来更像C而有一个愚蠢的规则说-type more“应该使用”不,你不应该。您“应该”使用最简单正确的解决方案。在这种情况下,是C样式的。<代码> RealTytCase<代码>是有原因的,并且许多C++编码准则清楚地表明,您应该更喜欢C风格的转换上的新样式。我不知道你为什么在这里对此大惊小怪。是的,它很长(比亚恩·斯特劳斯图普说这是“一个丑陋的操作的丑陋符号”),但别这样,它没那么难打字。@VladLazarenko——我只是想说清楚:我无意批评你
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;
}
char* dst = reinterpret_cast<char*>(/* your uint8_t* expression */);