自制程序 dump & binwrite 验证 用UE来查看文件二进制内容,显示不完全正确 的问题

来源:互联网 发布:淘宝上买刀具犯法吗 编辑:程序博客网 时间:2024/06/01 13:22

有一个测试文件,内容如下:

EF BB BF EF BB BF 61 62 63 0D 0A E4 B8 AD E6 96 87 0D 0A

用UltraEdit程序打开,二进制显示时,只显示了一个UTF8-BOM,即首部只有一个 EF BB BF;而用Binary Viewer则显示2个,上图就是程序显示的截图(不能贴图片,改为文本)

结论是:用UE来查看文件二进制内容,显示不完全正确。

以下是为了验证这个结论自制的两个小程序,功能刚好够用,可能有边界条件或安全问题没考虑到。

/*查看文件:十六进制*/#include <iostream>#include <cstdio> //printf#include <string>#include <fstream>using namespace std;int main(int argc, char** argv){if(argc > 1){ifstream file;file.open(argv[1],ios_base::binary);if(file.is_open()){int n = 0;unsigned char b;while(true){if(!file.read((char*)&b,1))break;if(n != 0)printf(" ");printf("%02X",b);n++;}}}return 0;}

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

/*编辑文件:十六进制插入(ins)/替换(ovr)/删除(del)举例:源文件testfile十六进制内容为: 01 02 03 041.在文件头部插入3个字节的数据命令: binwrite testfile ins 0 11 22 33执行后,testfile内容修改为: 11 22 33 01 02 03 042.从文件头部偏移第3个字节开始覆写3个字节的数据命令: binwrite testfile ovr 3 11 22 33执行后,testfile内容修改为: 01 02 03 11 22 333.从文件头部偏移第1个字节开始删除2个字节的数据命令: binwrite testfile ovr 1 2执行后,testfile内容修改为: 01 04*/#include <iostream>#include <cstdio> //printf#include <cstdlib> //atoi#include <string>#include <fstream>using namespace std;enum {EXE_NAME,FILE_NAME,OPT_TYPE,OFFSET,DATA};enum {INS, OVR, DEL};typedef unsigned char byte;int main(int argc, char** argv){if(argc > DATA){ifstream file;file.open(argv[FILE_NAME],ios_base::binary);if(file.is_open()){file.seekg(0,ios_base::end);ifstream::pos_type size = file.tellg();byte* src = new byte[size];file.seekg(0,ios_base::beg);file.read((char*)src,size);file.close();ofstream ofile;ofile.open(argv[FILE_NAME],ios_base::binary);if(ofile.is_open()){int offset = atoi(argv[OFFSET]);ofile.write((char*)src,offset);int type = (string(argv[OPT_TYPE])==string("ins") ? INS : (string(argv[OPT_TYPE])==string("ovr") ? OVR :(string(argv[OPT_TYPE])==string("del") ? DEL : OVR)));if(type==INS || type==OVR){for(int i=0; i<argc-DATA; i++){byte b /*= atoi(argv[DATA+i])*/;int hex = 0;sscanf(argv[DATA+i],"%02X",&hex);b = (byte)hex;ofile.write((char*)&b,sizeof(b));}if(type==INS){ofile.write((char*)(src+offset),(int)size-offset);} else if(type==OVR){ofile.write((char*)(src+offset+(argc-DATA)),(int)size-offset-(argc-DATA));} }else if(type==DEL){int ndel = atoi(argv[DATA]);ofile.write((char*)(src+offset+ndel),(int)size-offset-ndel);} else {//do nothing.}}}}return 0;}


原创粉丝点击