在过去的4个小时里,我一直在研究CRC算法.我很确定我已经掌握了它.
我正在尝试编写一个png编码器,我不希望使用外部库进行CRC计算,也不希望使用png编码本身.
我的程序已经能够获得与教程中的示例相同的CRC.就像维基百科一样:
使用与示例中相同的多项式和消息,我能够在两种情况下产生相同的结果.我也能够为其他几个例子做这件事.
但是,我似乎无法正确计算png文件的CRC.我通过在paint中创建一个空白的,一个像素大的.png文件来测试它,并使用它的CRC作为比较.我从png的IDAT块(计算CRC)中复制了数据(和块名称),并使用png规范中提供的多项式计算了它的CRC.
png规范中提供的多项式如下:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
Run Code Online (Sandbox Code Playgroud)
哪个应转换为:
1 00000100 11000001 00011101 10110111
Run Code Online (Sandbox Code Playgroud)
使用该多项式,我试图获得以下数据的CRC:
01001001 01000100 01000001 01010100
00011000 01010111 01100011 11101000
11101100 11101100 00000100 00000000
00000011 00111010 00000001 10011100
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
01011111 11000101 01100001 01101000 (MSB First)
10111011 00010011 00101010 11001100 (LSB First)
Run Code Online (Sandbox Code Playgroud)
这就是实际的CRC:
11111010 00010110 10110110 …
Run Code Online (Sandbox Code Playgroud) 我在尝试用C#保存大图像时遇到了困难(我说的是超过一千兆字节).
基本上我试图在部分中执行此操作 - 我有大约200个位图源,我需要一种方法在将它们编码为.png文件之前或之后将它们组合.
我知道这将需要大量的RAM,除非我以某种方式直接从硬盘驱动器传输数据,但我也不知道如何做到这一点.
每个位图源都是895x895像素,因此在编码后组合图像似乎并不容易,因为C#不允许您创建大小为13425 x 13425的位图.