gpt4 book ai didi

C++ fread : unsigned char and short mixture

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:32 26 4
gpt4 key购买 nike

我这里有一个示例代码:

    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(short)。

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

最佳答案

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

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,它将只使用部分读取数据 [if sizeof(short) == 1, CHAR_BIT 必须至少为 16,在这种情况下,东西会以不同的方式中断])。

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

关于C++ fread : unsigned char and short mixture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com