读写文件时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;                }            } 

读回图片如下:
这里写图片描述

原创粉丝点击