png图片CRC16crc验证失败怎么修改?

图形图像美术相关(20)
文件编码IO(23)
问题:一张PNG图片HIDR Chunk中的数据为:
00 00 00 0D 49 48 44 52 00 00 00 DC 00 00 00 DC 10 06 00 00 00 4B CA 13 C2
Chunk Type Code域和Chunk Data部分是:49 48 44 52 00 00 00 DC 00 00 00 DC 10 06 00 00 00
如何验证用该数据计算得到的CRC校验码是:4B CA 13 C2 ?
下面是代码验证过程代码和总结。
方法:用比较法来验证,为了得到结果综合法分析结合转换思想,逐步推进。
# include &stdio.h&
# include &string.h&
/*1.char*,unsigned char*,char,unsigned char的理解
char*,unsigned char*记录的就是二进制转换到的十六进制的字节码[整(整数补码(正整数还是原码负整数补码),浮点数IEEE74原码,字符编码原码),
存放顺序是先入先存放的,超过一个字节就会区分大小端存放。char*,unsigned char*指针转换到char,unsigned char会转换到字符类型。
但是char,unsigned char整数运算还是十六进制的字节码(包括位运算之类),所以可以提供十六进制整数序列,用整数指针访问序列每个元素(对于十六进制的字节码直接进行CRC计算。
如果希望char,unsigned char整数运算,能得到从整数来的值那么需要截取一个字节来处理;或者采用结构体赋予整型值放置在内存或者二进制文件中读取出来,然后一个个char,unsigned char整数运算
 2.大小端转换,png图片数据是用Big-Endian存储数值数据的需要转换为大端模式。
数值数据存在大小端区别,CC++结构体存储数值数据到二进制文件中,是以小端模式存放的,其实内存中也是小端模式的字节存放的(主流的CPU都这样);而PNG数值类型数据是以
大端模式存放的,所以从二进制文件中读取出来的时候需要经过大端到小端的转换,写入到png文件中的时候需要经过小端到大端的转换,而png的一些基于二进制CRC校验
都是在大端模式下的缓存块中进行的(压缩不确定是否如此,应该是在小端模式下进行压缩编码的)。
 3.结构体内存对齐,结构体在内存中本身存在内存对齐,所以写入到二进制文件中也有内存对齐问题, 读取出来时候需要减掉得到真实有用数据。
结构体内存对齐参数由#pragma pack(8)决定默认是8
1)第一个是系统找一个以对齐参数N倍数的地址为初地址(首地址偏移为0),后面的地址依次用min(N,本成员)作为实际对齐参数,该参数首个倍数地址(从首地址偏移)作为成员内存地址;
2) 内存对齐最终大小,是max(n1,n2,n3,...)最大元素的整数倍,不够后面就补0字节。
1)嵌套结构体是作为一个递归成员,内部成员大小为n自身对齐min(n,N)。但是内部第一个偏移:将内部最大作为n最终取min(n,N)作为对齐参数,首个倍数地址为内存地址。
内部右边界到外部第一个偏移:用的就是外部的成员作为n最终取min(n,N),首个倍数地址作为内存地址。
2) 数组成员(拆分):包含数组时候,整个数组不是作为一个成员,而是里面的每个元素作为一个结构体成员。
3) 有位段时的对齐规则(组合):同类型的、相邻的可连续在一个类型的存储空间中存放的位段成员作为一个该类型的成员变量来对待, 不是同类型的、相邻的位段成员,分别当作一个单独得该类型的成员来对待,分配一个完整的类型空间,其长度为该类型的长度,其他成员的分配规则不变,仍然按照前述的对齐规则进行。
typedef unsigned char BYTE ;
static uint POLYNOMIAL = 0xEDB88320 ;
uint g_CRCTable[256] ;
// 定义4MB 4194304为最大读取,如果大于也是读取4MB内容作为CRC计算
#define MAXLEN 1024
#define SToB_32(digitalValue) (uint((BYTE)digitalValue) && 24 \
| uint((BYTE)digitalValue && 8) && 16\
| uint((BYTE)digitalValue && 16) && 8\
| uint((BYTE)digitalValue && 24))
void init_table()
for (i = 0 ; i & 256 ; i++)
for (j = 0, g_CRCTable[i] = j & 8 ; j++)
g_CRCTable[i] = (g_CRCTable[i]&&1)^((g_CRCTable[i]&1)?POLYNOMIAL:0) ;
uint crc32(uint crc, char *buff, int len)
for (int i = 0; i & i++)
int data = buff[i];
crc = (crc && 8) ^ g_CRCTable[(crc ^ buff[i]) & 0xff];
uint crc32_foruint(uint crc, unsigned int data[], int len)
for (int i = 0; i & i++)
int nData = data[i];
crc = (crc && 8) ^ g_CRCTable[(crc ^ data[i]) & 0xff];
uint crc32_fromFile(const char *pDestPath, int nAlignWidth)
uint crcValue = 0;
FILE *pFile = NULL;
pFile = fopen(pDestPath, &rb&);
if(pFile == NULL)
printf(&fopen:%s fail!&, pDestPath);
fseek(pFile,0L, SEEK_END);
int nFileLenght = ftell(pFile) - nAlignW //减去结构体对齐大小
fseek(pFile,0L, SEEK_SET);
if(nFileLenght & MAXLEN)
printf(&File: %s 's size is bigger than %u byte.&, pDestPath, unsigned int(MAXLEN));
char buffer[MAXLEN];
fread(buffer, sizeof(char), nFileLenght, pFile);
fclose(pFile);
crcValue = crc32(crcValue, buffer, nFileLenght);
return crcV
bool writetofile(const char *pDestPath, unsigned char buffer[], int count)
FILE *pFile = NULL;
pFile = fopen(pDestPath, &wb&);
if(pFile ==
printf(&fopen or create:%s fail!&, pDestPath);
fwrite(buffer, sizeof(unsigned char), count, pFile);
fclose(pFile);
int main ()
// 初始化表
init_table();
char s[] = &aaaaaa&;
printf(&%08X\n&, crc32(0, s, strlen(s)));
unsigned int crcFileValue = crc32_fromFile(&f:\\data\\testcrc.txt&, 0);// testcrc.txt里面是aaaaaaa
printf(&%08X\n&,crcFileValue);
// arrayData是PNG图片的IHDR数据块的Chunk Type Code域和Chunk Data域中的数据
// 含义:0x49,0x48,0x44,0x52是&IHDR&Chunk块标志位,0x00,0x00,0x00,0xDC是PNG的Big-Endian表示的宽220pixel
// 高也是220pixel,深度是0x10真彩色,颜色类型是0x06带a类型的真彩色,0x00表示用Deflate压缩编码压缩图像数据
// 0x00表示将来使用更好的压缩方法预留,0x00表示非隔行扫描.
unsigned int arrayData[17] = {/*0x00,0x00,0x00,0x0D,*/0x49,0x48,0x44,0x52,0x00,0x00,0x00,\
0xDC,0x00,0x00,0x00,0xDC,0x10,0x06,0x00,0x00,0x00};// 图像中的CRC为 0x4BCA13C2
unsigned int crcValue = crc32_foruint(0, arrayData, 17);
printf(&%08X\n&, crcValue);// 验证输出确实为0x4BCA13C2,也是crcValue的Big-Endian模式的一个输出。
struct tagFileHead
unsigned char mark[4];
unsigned int widthP
unsigned int heightP
unsigned char methon[5];
tagFileHead fileH
fileHead.mark[0] = 'I';
fileHead.mark[1] = 'H';
fileHead.mark[2] = 'D';
fileHead.mark[3] = 'R';
fileHead.widthPixel = SToB_32(220);
fileHead.heightPixel = SToB_32(220);
fileHead.methon[0] = 16;
fileHead.methon[1] = 6;
fileHead.methon[2] = 0;
fileHead.methon[3] = 0;
fileHead.methon[4] = 0;
/*fileHead.methon[4] = NULL;
fileHead.methon[4] = 0;
fileHead.methon[4] = 0;*/
const char *pDestPath = &f:\\data\\crc&;
FILE *pFile = fopen(pDestPath, &wb&);
if(pFile ==
printf(&fopen or create:%s fail!&, pDestPath);
fwrite((void*)&fileHead, sizeof(tagFileHead), 1, pFile);
fclose(pFile);
unsigned int crcFileValue2 = crc32_fromFile(&f:\\data\\crc&, 3);
printf(&%08X\n&,crcFileValue2);
return 0 ;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:117533次
积分:3169
积分:3169
排名:第6115名
原创:189篇
转载:48篇
译文:10篇
(7)(2)(18)(32)(15)(12)(6)(21)(26)(40)(1)(4)(9)(22)(3)(4)(1)(1)(1)(1)(2)(1)(18)(1)QQ截图下来的图片扩展名怎么是.16,要改为.png 怎么解决_百度知道
QQ截图下来的图片扩展名怎么是.16,要改为.png 怎么解决
每次截图后都要修改扩展名,很麻烦,请教怎么改回.png格式
在保存截图前把文件夹选项中的“隐藏已知文件类型的扩展名”前面的勾去掉,再截图时加个.png的扩展名。 以后每次截图都会以很简单
其他类似问题
为您推荐:
qq截图的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁登陆网页PNG图片验证码无法显示的解决办法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
登陆网页PNG图片验证码无法显示的解决办法
上传于||文档简介
&&W​i​n系​统​,​浏​览​器​I​E.,​用​户​登​录​时​的​图​片​验​证​码​无​法​显​示​,​显​示​为​空​白​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢怎么用Photoshop将PNG格式的图片里面的文字进行修改,高手请帮下忙
怎么用Photoshop将PNG格式的图片里面的文字进行修改,高手请帮下忙
图像-模式-RGB模式 就可以了
的感言:谢谢
其他回答 (2)
用CoreIDRAW修改噻!
如果不可以直接更改,那么就把模式改成RGB的就好了
那改了保存的时候能保存成PNG格式的吗?
可以保存的,PNG格式一般用于网页透明效果的。
可是它的源文件是PSD格式的
我现在改的的副本
psd格式的你做好之后不需要修改的话那就合层就行了,最后另存为png即可。
刚刚试了 根本不行啊
你想怎么搞,我帮你弄下。加
相关知识等待您来回答
多媒体领域专家
& &SOGOU - 京ICP证050897号

我要回帖

更多关于 易语言png验证码 的文章

 

随机推荐