我这里有一个示例代码:
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(短)”?
答案 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) > 2
,sizeof(short) == 1
必须至少为16,在这种情况下,东西会以不同的方式中断]。
CHAR_BIT
size
参数用于指定构成一个单位的字节数,因此不会读取部分单位,缓冲区包含fread
个完整单位。
答案 1 :(得分:0)
如您所见,此代码进行了一些编码/解码。然后它在内存中分配一个块,并且转换为unsigned char
。这个演员的原因是你想要使用readed值的第一个和第二个字节。
阅读短数字
您将知道成功的数量如何。
您可以轻松处理特殊情况,例如输入包含奇数个字符