我正在 MSVC++2010 中编写 CRC32 例程,需要以二进制模式逐字节读取文件。
我正在使用ifstreamand istreambuf_iterator,它通常可以工作,但它对行尾做了一些奇怪的事情。
例如,如果我有一个包含内容的文件
LF LF LF CR CR CR
我的程序的输出是
(10) (10) (13) (13) (13) (13)
所以基本上,它用 CR 替换了最后一个 LF。奇怪的。
如果我有
CR CR LF CR
它是
(13) (10) (13) (13)
所以它交换了CRLF!当文件中有更多内容时,它也会交换它们。
有什么解决方法吗?我想为此坚持使用 C++,实际上我想读取二进制文件而不解释任何行尾(我认为只istream_iterator会这样做)!
为了完整起见,我的测试代码是这样的,改编自pyCRC:
static inline crc_t crc_update(crc_t crc,
std::istreambuf_iterator<char> data,
long long data_len)
{
unsigned int tbl_idx;
while (data_len--)
{
tbl_idx = (crc ^ *data) & 0xff;
crc = (crc_table[tbl_idx] ^ (crc >> 8)) & 0xffffffff;
data++;
std::cout << " (" << int(*data) << ")";
}
return crc & 0xffffffff;
}
int main(int argc, char* argv[])
{
std::ifstream file(argv[1], std::ios::in | std::ios::binary);
struct _stati64 filestats;
errno_t stat_error = _stati64(argv[1], &filestats);
if (stat_error != 0)
return errno;
std::cout << crc_finalize(
crc_update(crc_init(),
std::istreambuf_iterator<char>(file),
filestats.st_size));
}