读写文件时00 0A与80 0A的bug
来源:互联网 发布:淘宝水晶店哪家是真的 编辑:程序博客网 时间:2024/06/06 04:38
苦于手头没有16位的图像,于是想用程序画一个来替代。就是从0开始一直加到65535,看起来是一种由暗渐变到亮的效果。生成的程序很简单
uint16_t i(0),j(0); ofstream outf("IAmRaw.txt");//输出文件 for (i = 0; i < 512; i++) { for (j = 0; j < 512; j++) { t = j * 128; outf << (uchar)t;// &0x00ff); outf << (uchar)(t >> 8);// &0x00ff); } } outf.close();
读取的程序也不多
FILE *RAWFile; errno_t err; char *RAWAddr; //char unknown[2048]; err = fopen_s(&RAWFile, RAWFlieName, "rb"); if (err == 0) { //cout << "The file "<<RAWFlieName<<" was opened"<< endl ; //fseek(RAWFile, 0, SEEK_END); int rawFileSize = IMAGECOL*IMAGEROW*2;// ftell(RAWFile); RAWAddr = new char[rawFileSize]; rewind(RAWFile); //cout << RAWAddr; //_fread_nolock(unknown, sizeof(char), 1024, RAWFile);// if (!rawFileSize == _fread_nolock(RAWAddr, sizeof(char), rawFileSize, RAWFile)) { fclose(RAWFile); delete[] RAWAddr; cout << "读取文件 " << RAWFlieName << " 失败!!" << endl; return -1; } //cout << sizeof(RAWAddr); //printf("%s", RAWAddr); if (RAWFile) { err = fclose(RAWFile); if (err != 0) { cout << "关闭文件 " << RAWFlieName << " 失败!" << endl; } //memset(rawData,0,sizeof(rawData)); for (i = 0; i < IMAGEROW; i++)//reorder gray { for (j = 0; j < IMAGECOL; j++) { unsigned short pointH = (unsigned short)*(RAWAddr + (i*IMAGECOL + j) * 2 + 1); rawData[i][j] = (pointH << 8) + (uchar)*(RAWAddr + (i*IMAGECOL + j) * 2); } } delete[] RAWAddr;
但是显示成图像就成了这样
仔细观察每一行不但多出了一个点,在较暗的区域还有一个特别亮的点,仔细分析数据发现原本应该是2560、2688的两个点变成了3328、32778、2573这三个数。调了一晚上,几乎崩溃。简直无解!!!!!
于是我又专门用2560和2688写了一个文件,发现文件很大(相比较从前)。使用Binary viewer软件一看,发现在每一个00与0A、80与0A中间都多出了一个0D。再查看原文件,如图:
这是为什么呢?
查一下ASCii表发现0D是回车键,0A是换行建,而windows使用的换行符为\r\n;windows系统中对于换行\n是自动加上\r的。这样一来就发现了其中的原由。
是在写入文件时出现了0A,window系统认为我输入的是换行\n,于是自动加上了一个\r即0D;于是我原来的编码就乱了套,出现了图中的白线。
对程序作如下修改
if (RAWFile) { err = fclose(RAWFile); if (err != 0) { cout << "关闭文件 " << RAWFlieName << " 失败!" << endl; } //memset(rawData,0,sizeof(rawData)); rn = RAWAddr; for (i = 0; i < IMAGEROW; i++)//reorder gray { for (j = 0; j < IMAGECOL; j++) { if (*(rn+1) == 0x0d && *(rn+2) == 0x0a) { rn++; } unsigned short pointH = (unsigned short)*(rn+1); rawData[i][j] = (pointH << 8) + (uchar)*(rn); rn+=2; } }
读回图片如下:
阅读全文
1 0
- 读写文件时00 0A与80 0A的bug
- C++读写文件时,0A转化为0D 0A
- a,&a,&a[0]
- a &a &a[0]
- 数组中&a与&a[0]的区别
- a a[0] &a &a[0]的理解
- 文件编码与文件的读写与0x0D0A
- a与a[0]一样吗?
- C++中数组a与&a,&a[0]
- <a href="" />,<a href="#" />与<a href="javascript:void(0)" />的区别
- int a[], &a与a的区别
- 数据库复制及文件读写的bug
- *a[] 与 (*)a[]的区别
- a++与++a的区别
- a++与++a的区别
- a与&a的区别
- a 与&a 的区别
- a 与 &a 的区别
- 各大公司对于java求职者的要求,你值得一看
- Thinkphp 模型->区间查询
- Test...
- 抽象类和接口
- 测试啊
- 读写文件时00 0A与80 0A的bug
- MyBatis + maven org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
- CSS 的优先级机制[总结]
- 判断三点顺序(顺时针或者逆时针)(模板)
- poj3461——Oulipo(kmp)
- Spring Scheduled + Redis 实现分布式定时器(一)
- 自定义View系列目录索引
- Redis应用场景
- [拓扑序] Educational Codeforces Round 25 825E. Minimal Labels