我正在尝试cksum
使用 Boost.CRC 实现简单的 POSIX。
我使用的代码相当于:
for(int i = 1; i<argc; ++i)
{
support::file current(argv[i], support::file::access::read);
size_t octets = 0;
boost::crc_32_type crc;
while(true)
{
size_t bytes_read = current.read_some(buffer_size, buffer);
octets += bytes_read;
crc.process_bytes(&buffer[0], bytes_read);
if(bytes_read < buffer_size)
break;
}
if(i>1)
support::print("\n");
support::print(boost::lexical_cast<string>(crc.checksum()) + " " + boost::lexical_cast<string>(octets) + " " + argv[i]);
}
哪里support::file
是一个简单fopen
/fread
二进制文件 I/O 包装器,我成功地用于cat
实现。support::print
提供与 相同的输出std::cout
,但我需要它在 Windows 上进行可靠的非 ASCII 输出。
Boost 标头有这个:
typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true> crc_32_type;
作为唯一的 32 位 CRC typedef。cksum
它为空文件 ( )给出了错误的答案(使用 GNUWin32 coreutils 检查touch test && cksum test
)。我尝试使用上述 typedef 并将其中一个或两个0xFFFFFFFF
值修改为 0,我得到了空文件的正确结果,但任何其他文件仍然给出不同的结果。
Boost.CRC 与POSIXcksum
规范有何关系?