Я пишу процедуру CRC32 в MSVC ++ 2010, и мне нужно прочитать файл в двоичном режиме, побайтно.
Я делаю это с ifstream
и istreambuf_iterator
, и это обычно работает, но оно делает некоторые странные вещи с окончаниями строк.
Например, если у меня есть файл с содержанием
LF LF LF CR CR CR
вывод моей программы
(10) (10) (13) (13) (13) (13)
так что в основном он заменил последний LF на CR. Странный.
Если у меня есть
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));
}