2

我在这里有一个示例代码:

    unsigned char *m_fbytes;
    m_fbytes = (unsigned char*)malloc(m_iByteLen1FrameDecoded*sizeof(short));

    int err;
    err = fread(m_fbytes, sizeof(short), 960, fin);
    curr_read = err;
    for(int i=0;i<curr_read;i++)
    {
        opus_int32 s;
        s=m_fbytes[2*i+1]<<8|m_fbytes[2*i];
        s=((s&0xFFFF)^0x8000)-0x8000;
        m_in[i]=s;
    }

    int iLen = encode(m_enc, m_in, m_iByteLen1FrameDecoded, m_data, m_max_payload_bytes);

我不明白这一行:

err = fread(m_fbytes, sizeof(short), 960, fin);

这段代码的作者读取了一些字节(又名无符号字符),但他们通过了 sizeof(short)。

他们为什么使用“sizeof(short)”?

4

2 回答 2

2

该代码包含一些使其变得不必要的脆弱的默认假设。读取字节的使用方式

s=m_fbytes[2*i+1]<<8|m_fbytes[2*i];
s=((s&0xFFFF)^0x8000)-0x8000;

假设是

  • CHAR_BIT == 8; 现在这是一个非常安全的假设,除非处理异国硬件,但不能保证。

  • sizeof(short) == 2; 这也很可能是真的,但也不能保证。

读取字节的使用方式,它们的每一对相邻在最终结果中构成一个单元(因此使用2而不是sizeof(short)会更健壮,如果sizeof(short) > 2,它将仅使用部分读取数据[如果sizeof(short) == 1CHAR_BIT必须至少16,在这种情况下,东西将以不同的方式破坏])。

size参数to用于指定一个单元有fread多少字节组成,这样不读取部分单元,缓冲区包含err完整单元。

于 2013-05-18T18:25:18.337 回答
0

如您所见,此代码进行了一些编码/解码。然后它在内存中分配一个块,并强制转换为unsigned char. 这个转换的原因是你想使用读取值的第一个和第二个字节。

通过阅读短数字

  • 您将知道成功读取的次数。

  • 您可以轻松处理特殊情况,例如输入包含奇数个字符

于 2013-05-18T18:26:03.790 回答