C ++ fread:unsigned char和short mixture

时间:2013-05-18 18:03:32

标签: c++ sizeof fread

我这里有一个示例代码:

    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);

此代码的作者读取了一些字节(也称为unsigned char),但它们传递sizeof(短)。

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

2 个答案:

答案 0 :(得分: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)会更加健壮,如果{{1} },它只会使用部分读取数据[if sizeof(short) > 2sizeof(short) == 1必须至少为16,在这种情况下,东西会以不同的方式中断]。

CHAR_BIT size参数用于指定构成一个单位的字节数,因此不会读取部分单位,缓冲区包含fread个完整单位。

答案 1 :(得分:0)

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

阅读短数字

  • 您将知道成功的数量如何。

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