一、CentOS重启后无法上网问题
真实机器(不是虚拟机)本来好好的,有网线(网卡enp0s31f6)有wifi (enp1s0)可以上网的,之前重启N次都依旧可以上网。但昨天一次重启后居然无法上网,怎么都连接不上。
网上的很多办法都试过了,结果把本来仍有的enp1so都搞没了:
enp1s0没有了,于是ip link
set
dev enp1s0 up 想将这个网卡重新启动,然后再用ip addr 好像就看到了enp1s0 (此处不太记得了)。
但是此时service network start仍旧是失败的,
此时 cd /etc/init.d 或者/ect/rc.d/init.d 后 ./network restart 仍旧是失败的(此处也不太记得了)。然后按照 https://www.cnblogs.com/yxyht/p/5063505.html在/etc/sysconfig/network-scripts/下新建了一个ifcfg-enp1s0,按照ifcfg-enp0s31f6里面的内容,修改相应地方。
但是重启后service network start 仍旧是失败的,但是 ping www.baidu.com已经通了。证明可以上网了哈哈。
具体原因我也不太清楚。
二、fread()与imread()读取bmp图片的差别
之前是用opencv读取bmp图片Mat.data拿到图片指针然后映射到buffer会导致严重的内存到内存的拷贝问题,严重拉低了OpenCL
的效率。所以只能改用fread()直接读到buffer的映射指针内,这样就避免了cpu到cpu的拷贝。我用的是:
bool readBmp2Ptrwhole(char *BmpFileName,uchar *imgdata) { FILE * pFile; int dataOffset; pFile = fopen(BmpFileName,"rb"); if(!pFile) { return false; } //得到数据的偏移字节 fseek(pFile,DataOffset,SEEK_SET); fread(&dataOffset,4,1,pFile); //得到bmp的宽与高的像素数 fseek(pFile,SizeOffset,SEEK_SET); int bmpWidth,bmpHeight; fread(&bmpWidth,pFile); fread(&bmpHeight,pFile); //注意,有些图片存在取出为负的情况 bmpWidth = abs(bmpWidth); bmpHeight = abs(bmpHeight); fseek(pFile,BiBitCount,SEEK_CUR); int bmpBiBitCount; fread(&bmpBiBitCount,2,pFile); //printf("biBitCount %d\n",newBmpData->bmpBiBitCount); //位图片数据分配空间 int BytesPerPixel = bmpBiBitCount / 8; int LineLength,TotalLength; LineLength = bmpWidth * BytesPerPixel; // 每行数据长度大致为图象宽度乘以 // 每像素的字节数 while( LineLength % 4 != 0 ) // 修正LineLength使其为4的倍数 ++LineLength; TotalLength = LineLength * bmpHeight; // 数据总长 = 每行长度 * 图象高度 // imgdata = (unsigned char *)malloc(TotalLength * sizeof(unsigned char)); fseek(pFile,dataOffset,SEEK_SET); fread(imgdata,sizeof(unsigned char),(size_t)(long)TotalLength,pFile); fclose(pFile); return true; }用这个读到已经分配好的imgdata内。但我发现与opencv的imread得到的Mat.data数据不一样。我以为是上面这个函数错的,读图有问题,于是我用下面这个函数将刚刚读到的imgdata转化为图片保存,看是否与原图一致:
bool SaveBmp(int w,int h,unsigned char *pdata,char *BmpFileName,bool IsRGBA ) { #define BMP_Header_Length 54 unsigned char header[BMP_Header_Length] = { 0x42,0x4d,54,40,IsRGBA ? 32 : 24,0 }; long file_size = (long)w * (long)h * (IsRGBA ? 4 : 3) + 54; header[2] = (unsigned char)(file_size &0x000000ff); header[3] = (file_size >> 8) & 0x000000ff; header[4] = (file_size >> 16) & 0x000000ff; header[5] = (file_size >> 24) & 0x000000ff; long width = w; header[18] = width & 0x000000ff; header[19] = (width >> 8) &0x000000ff; header[20] = (width >> 16) &0x000000ff; header[21] = (width >> 24) &0x000000ff; long height = h; header[22] = height &0x000000ff; header[23] = (height >> 8) &0x000000ff; header[24] = (height >> 16) &0x000000ff; header[25] = (height >> 24) &0x000000ff; FILE *pWritingFile = NULL; pWritingFile = fopen(BmpFileName,"wb"); if( pWritingFile == NULL ) return false; fwrite(header,pWritingFile); int BytesPerPixel = IsRGBA ? 4 : 3; int LineLength,TotalLength; LineLength = w * BytesPerPixel; // 每行数据长度大致为图象宽度乘以 // 每像素的字节数 while( LineLength % 4 != 0 ) // 修正LineLength使其为4的倍数 ++LineLength; TotalLength = LineLength * h; // 数据总长 = 每行长度 * 图象高度 //fwrite(pdata,PixelDataLength,pWritingFile); fwrite(pdata,pWritingFile); // 释放内存和关闭文件 fclose(pWritingFile); return true; }
结果保存出来又是与原图一致的。说明这两个函数都是正确的。
结果同事告诉我,是bmp的编码格式问题:https://blog.csdn.net/herbenlam/article/details/53432004 这里说明了bmp是按从下到上编码的(这也表现在 fread(&bmpWidth,pFile); fread(&bmpHeight,pFile); 这两句得到的高宽是负数,负数表示从下到上,正数表示从上到下),而opencv是将bmp的从下到上转化了一下转化为从上到下在Mat.data里。而fread(bmp)和fwrite(bmp)都是从最后一行读(写)到第一行从而完成对bmp图像的读(写)。
所以我比较了readBmp2Ptrwhole()读出来的最后一行与opencv的imread的Mat.data的第一行,果然数据一致了。
哎,想问题不够深入。