【问题标题】:C++ function with rounding (cross-platform)带舍入的 C++ 函数(跨平台)
【发布时间】:2014-01-10 07:37:09
【问题描述】:

我有以下无法正确使用的功能。 我一次又一次地研究它,但不知何故总是有问题。

我已经编码了一些音频数据。 音频数据以每个 3 字节的“帧”编码。

例如这样:

Frame #1
0
1
2

Frame #2
3
4
5

Frame #3
6
7
8

现在,当我想解码一些音频时(假设从字节位置 4 开始,长度为 3 个字节,我首先必须计算在哪一帧中可以找到该音频,我必须解码多少帧以及偏移量是多少在解码帧中是。

在这种情况下,我必须读取第 2 帧和第 3 帧,并且偏移量为 1。

我已尝试设置以下 void:

int g_iByteSize1FrameDecoded = 3;

void CalcFrames(unsigned long uByteStart,unsigned long uByteCount,unsigned long &uStartFrame,unsigned long &uFramesToRead,unsigned long& uOffset)
{
    ////calculate in which decoded frame the byte from uByteStart would be found in
    uStartFrame = ((uByteStart) / g_iByteSize1FrameDecoded) + 1;
    unsigned long iEndFrame = ((uByteStart + uByteCount) / g_iByteSize1FrameDecoded) + 1;

    uFramesToRead = (iEndFrame - uStartFrame + 1);

    uOffset = (uByteStart) % g_iByteSize1FrameDecoded;
}

但它不起作用,总是出错...四舍五入,数学本身...

有一些数学技能的人可以看看我的错误可能在哪里吗?

【问题讨论】:

  • 一个恰好有void返回类型的函数通常不被称为“void”。我已经相应地更新了你的标题和问题。

标签: c++ math


【解决方案1】:

字节 i 在 i / 3 帧中,偏移量 i % 3:

void CalcFrames(unsigned long uByteStart,unsigned long uByteCount,unsigned long &uStartFrame,unsigned long &uFramesToRead,unsigned long& uOffset) {
    uStartFrame = uByteStart / g_iByteSize1FrameDecoded + 1;
    uOffset = uByteStart % g_iByteSize1FrameDecoded;
    unsigned long lastFrame = (uByteStart + uByteCount - 1) / g_iByteSize1FrameDecoded + 1;
    uFramesToRead = lastFrame - uStartFrame + 1;
}

【讨论】:

  • 我已经更新了我的问题,以便字节以 0 开头。你能相应地改变你的答案吗?谢谢!
【解决方案2】:

我怀疑你决定从 1 而不是 0 开始计算帧和字节数,但也许它对你的其余代码更有效 - 我不知道。

CalcFrames 而言,我只能看到uOffset 的问题。计算应该是:

uOffset = (uByteStart % g_iByteSize1FrameDecoded) - 1;

对于您的示例,字节 5 与帧开头的偏移量为 1 个字节。您最初的计算只是简单地做 5 % 3 即 2,因此需要额外减去 1。

【讨论】:

  • 抱歉,我不得不对您的答案投反对票,因为您的更改没有纠正它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2010-12-25
相关资源
最近更新 更多