我正在 MSVC++2010 中编写 CRC32 例程,需要以二进制模式逐字节读取文件。
我正在使用ifstream
and 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));
}