65,210
社区成员
发帖
与我相关
我的任务
分享
if(16 == read_len) //这是绝大多数情况
{
cout<<" |";
}
else
{
int blank = (16-read_len)*3 + 3 + (read_len>7?1:0); //每个byte输出2个字节+1个空格,最后空2个空格(3因为'|'要一个位置),第8、9字符之间多1个空格
cout<<setfill(' ')<<setw(blank)<<'|';
}
while(1) {
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
//read_len是本次读取的数据长度,在遇到结尾前,都是16
//但遇到文件结尾了,就可能不是。所以通过tellg得到当前位置,减去index(已读数据长度),得到最后一次读的长度
read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0) //read_len为0了,所有数据已处理完,退出循环
break;
}
cout<<hex<<setfill('0')<<setw(8)<<index; //按16进制格式打印index,宽度为8,不足8位用0填充
for(i=0;i <read_len;i++)
{
cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}
cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|'; //setw判断read_len,主要为了处理最后一行
for(i=0;i <read_len;i++)
if (buffer[i]>0 && isprint(buffer[i])) //isprint判断是否为可打印字符,参数是int,而buffer[i]是char,先判断避免错误~
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;
index+=read_len;
}
///对isprint补充说明下。由于读取二进制文件,有些字符ASCII码值在128~255之间,比如汉字的第一个字节,而buffer[i]是char类型的,
///此时将是一个负值,不加判断直接调用isprint似乎会引发这个函数运行时错误(个人估计是isprint查表时越界引起),因而加上buffer[i]>0。
///回过头看看,char buffer[16];这个数组的类型声明是不合适的,读二进制,应该用unsigned char。那就能省去isprint的判断,以及打印时(int)((unsigned char)buffer[i])这样的强转
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <conio.h>
using namespace std;
//以显示全部的模式显示文件inputFile
void DispFileShowAllMode(ifstream &inputFile)
{
int index=0,read_len;
char buffer[16];
int i;
while(1) {
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0)
break;
}
cout<<hex<<setfill('0')<<setw(8)<<index;
for(i=0;i <read_len;i++)
{
cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}
cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|';
for(i=0;i <read_len;i++)
if (buffer[i]>0 && isprint(buffer[i]))
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;
index+=read_len;
}
}
int main( void )
{
int handle=1;
int index=0;
int w,x;
string inputFileName;
ifstream inputFile;
cout << "輸入要開啟的檔名(包含副檔名):";
cin >> inputFileName;
inputFile.open (inputFileName.c_str(),ios::in|ios::binary);
while(inputFile.fail())
{
inputFile.clear();
cout << "無此檔,請重新輸入:";
cin >> inputFileName;
inputFile.open (inputFileName.c_str(),ios::in|ios::binary);
}
inputFile.seekg (0, ios::end);
int length = inputFile.tellg();
cout <<"************************************" <<endl;
cout <<setw(5) <<"開啟檔案:" <<inputFileName <<"\n檔案大小:" <<length <<"(" <<hex <<length <<")" <<"bytes" <<endl;
cout <<"************************************" <<endl;
inputFile.seekg (0, ios::beg);
cout <<"==================" <<endl;
cout <<"1.Dump all file .\n" <<"2.Input start address ." <<endl;
cout <<"==================\n" <<"Select (1,2) :" <<endl;
w=getch();
if (w=='1')
{
cout <<"1.ALL show\n" <<"2.PAGE show" <<endl;
x=getch();
switch (x)
{
case '1':
DispFileShowAllMode(inputFile);
break;
case '2':
default:
break;
}
}
return 0;
}