2

我正在 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));
}
4

1 回答 1

1

这不是缺少 CR 的最后一个 LF,而是文件中的第一个 LF 丢失了,就像您data++;之前所做的那样std::cout << " (" << int(*data) << ")";

自己试过了,没有遗漏任何东西......

顺便说一句:我正在使用 g++。

于 2011-12-01T03:49:39.390 回答