您的位置:首页 > 其它

读写二进制时,怎么将ASCII码大于等于128的char字符转换为16进制输出

2014-08-13 17:31 441 查看
首先,要将char转换成对应的整型大小。比如ASCII码164对应的字符串,二进制形式:1010 0100.

直接使用强制转换成int再输出16进制的话,会得到ffffffa4,这是因为字符串的最高位1的问题。

使用下面的这个函数,就可以得到与ASCII码相同值的int

int getInt(char chVar)
{
//将字符串右移7位,观察结果是否为1
int nVal = chVar>>7;
//高位为1
if( -1 == nVal)
{
char cTemp = chVar&0x7f; //将高位1变为0
nVal = (int)cTemp + 128;
}
else
{
nVal = (int)chVar;
}
return nVal;
}


通过这个方法,可以实现将二进制文件用十六进制输出

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int getInt(char chVar) { //将字符串右移7位,观察结果是否为1 int nVal = chVar>>7; //高位为1 if( -1 == nVal) { char cTemp = chVar&0x7f; //将高位1变为0 nVal = (int)cTemp + 128; } else { nVal = (int)chVar; } return nVal; }

int main()
{
ifstream inFile; //文件输入流对象
string strFilename;
cout<<"input the file name : ";
cin>>strFilename;
cout<<strFilename<<endl;
inFile.open(strFilename.c_str(),ios::binary|ios::in); //将文件输入流绑定文件
//判断文件是否打开成功
if (!inFile)
{
cerr<<"文件打开失败"<<endl;
}

//获得文件大小,总字节数
inFile.seekg(0,ios::end);
long int nFileLength = inFile.tellg();
inFile.seekg(0,ios::beg);
long int pos = inFile.tellg();
cout<<nFileLength<<"字节"<<endl;
int nCount = 0;
while(pos <nFileLength)
{
char ch;
inFile.read(&ch,sizeof(char));
int nTemp = getInt(ch);
if(nCount%16 == 0)
{
cout<<setw(8)<<setfill('0')<<setiosflags(ios::uppercase)<<hex<<nCount<<" "; //输出16进

制的地址
}

cout<<setw(2)<<setiosflags(ios::uppercase)<<hex<<nTemp<<" ";
if(nCount%16 == 15)
{
cout<<endl;
}
++nCount;
pos = inFile.tellg();
}
cout<<endl;
return 0;
}


效果如图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: