正如评论中提到的那样,如果长度大于 255,则提供的解决方案将不起作用。例如,如果实际长度为 296(二进制 00000001 00101000),则前面介绍的解决方案将产生 41 => 00000001 + 00101000 = 1 + 40 = 41。
必须考虑读取的字节数。在这个例子中,计算长度的正确方法是 1*(2^8) + 40 = 296。所以正确的解决方案可能是:
unsigned int length = 0;
//read the first four bytes
for (int i = 0; i < 4; i++) {
int read_char = getchar();
length += read_char * (int) pow(2.0, i * 8);
}
下面介绍了基于位移和位操作的更好的解决方案(可能有点难以理解,但肯定更整洁):
unsigned int length = 0;
for (int i = 0; i < 4; i++) {
unsigned int read_char = getchar();
length = length | (read_char << i * 8);
}
重要的是要注意 getchar() 返回的 int 在执行与当前长度值的位或之前被强制转换为 unsigned int (int 为符号保留一位,unsigned int 没有)。
现在,我不确定这里可能出现的潜在大/小端问题,因为我没有在不同的架构上测试过这个解决方案。我希望有更多经验的人可以对此发表评论。