读取十六进制文件并将其存为字节数组 RT,程序以简单为美,分数全给写的最简单的那个人 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 FILE* fpFile = fopen(dlg.GetPathName(), "rb"); if (!fpFile) return ; unsigned char* bytebuff = 0; fseek(fpFile, 0, SEEK_END); int file_len = ftell(fpFile); fseek(fpFile, 0, SEEK_SET); bytebuff = new unsigned char[file_len]; fread(bytebuff, file_len, 1, fpFile); m_sDisplayFile = ""; for (int i = 0; i < file_len; ++i) { unsigned long dw = (unsigned long)bytebuff[i]; CString str; str.Format("%02x", dw); m_sDisplayFile += str; } delete bytebuff; fclose(fpFile); String2Hex(m_sDisplayFile);}//将字符串转为十六进制字符串int CKeyReaderDlg::String2Hex(CString &str){ int hexdata,lowhexdata; int hexdatalen = 0; int len=str.GetLength(); m_sendData.SetSize(len); for(int i=0; i < len;) { char lstr, hstr = str[i]; i++; if(i >= len) break; lstr = str[i]; hexdata = ConvertHexChar(hstr); lowhexdata = ConvertHexChar(lstr); if ((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata * 16 + lowhexdata; i++; m_sendData[hexdatalen] = (char)hexdata; hexdatalen++; } m_sendData.SetSize(hexdatalen); return hexdatalen;}//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1char CKeyReaderDlg::ConvertHexChar(char ch) { if ((ch >= '0 ') && (ch <= '9')) return ch - 0x30; else if ((ch >= 'A') && (ch <= 'F')) return ch - 'A' + 10; else if ((ch >= 'a') && (ch <= 'f')) return ch - 'a' + 10; else return (-1); }这是我的实现方法,显然太麻烦了。。 纵观你的代码 可以简写成几行CStdioFile file;file.Open(dlg.GetPathName(), CFile::modeRead);file.ReadString(m_sendData); char strHex[1000];unsigned char byTemp;for(int i=0;i<1000;i+=2) sscanf(strHex+i,"%x",&byTemp)类似这样 好吧 我又回来了 按我的理解给你写了段代码 CFile file; file.Open(path, CFile::modeRead); int fileSize = file.GetLength(); CString txtResult; file.Read(txtResult.GetBuffer(fileSize+1), fileSize); txtResult.ReleaseBuffer(fileSize); CString hexResult; char *pBuf = hexResult.GetBuffer(fileSize*2 + 1); const char* pStr = txtResult; while (*pStr) { sprintf(pBuf, "%0.2X", *pStr++); pBuf += 2; } hexResult.ReleaseBuffer(fileSize<<1); file.Close(); 就是HEX文件,里面的数据都是十六进制数 形如 0102030405060708090A0B0C0D0E0F1112131415161718191A1B1C1D1E1F 这样以ASC码形式体现数据的? 能有啥好方法哦?不就是一个字符一个字符的处理么?每次处理,要么直接用if..else..,要么麻烦点用switch,估计用switch速度更快一点点。然后每处理两个字符,保存一个字节。 假设保存的十六进制文件是每个字节都保存为十六进制,这里的代码也可以简写为 FILE* fpFile = fopen(dlg.GetPathName(), "rb"); if (!fpFile) return ; unsigned char* bytebuff = 0; fseek(fpFile, 0, SEEK_END); int file_len = ftell(fpFile); fseek(fpFile, 0, SEEK_SET); bytebuff = new unsigned char[file_len]; fread(bytebuff, file_len, 1, fpFile); m_sDisplayFile = ""; for (int i = 0; i < file_len; ++i) { unsigned long dw = (unsigned long)bytebuff[i]; CString str; str.Format("%02x", dw); m_sDisplayFile += str; } delete bytebuff; fclose(fpFile); 前段时间我要做一个同样的问题,结果没有人理我,自己却弄出来了,楼主,你分子给的高,来的人多楼主,其实十六进制的文件,只是表示形式上的不同,内容一样。1.用二进制读取。2.每读两位存入一个BYTE。3.把两位十六进制数转换成十进制数,即字符编码。(十六进制转十进制,需要自己写)4.循环直至结束。 应该称为对一段字符进行编码比较合适,和Base64等差不多,只是你的要求更简单些 CFile m_file; BYTE *pBt; m_file.Open() pBt = new BYTE(m_file.getLegth()); pBt = m_file.Read(m_file.getLegth()); ... ... delete pBt; 可以先读出来然后再字符串转为十六进制数啊 如int32.parse();十六进制再转为字节就行 Convert.ToByte(); #include <stdio.h>int main( int argc, char *argv[] ){ char buf[1024 + 1]; char ch; int index = 0; FILE *fp; memset( buf, 0x00, sizeof(buf) ); if ( ( fp = fopen( argv[1], "rb" ) ) == NULL ) { printf( " Error\n"); return 1; } while ( ( ch = fgetc( fp ) ) != EOF && !feof( fp ) && index < 1024 ) { sprintf( buf + index,"%02x\n", ch ); index += 2; } printf( "RE:\n%s\n", buf ); return 0;}试试这个可以么?关于十六进制中如何判断文件结束还是有疑问 工具有,winhex.我经常把一个文件做buffer.winhex那个功能读出来就已经是unsigned char data[xx]={0x11,0x22...};这样了,使用相当方便 所有的计算机里的文件都是二进制的。没有什么文件是以16进制保存的。16进制显示是为了人读取方便。字节数组?我以前没听过,以后也许会学到。我只听过字符数组比较类似。再有你在13楼问“只实现了一半,还有保存为字节数组呢”CString m_sendData;本身就是一个无定长度的字符串数组。m_sendData.GetAt(0)就是第1个元素。m_sendData.GetAt(1)就是第2个元素。…… To 45 楼 baoyz 的回复:]你好,感谢回复。计算机中的文件最终都是用0和1表示,即二进制。但是文件的编码和保存则有多种格式,ASCII,二进制(BIN),十六进制(HEX)。字节数组,这里说的是BYTE为类型保存的数组,既然能用INT,CHAR,为什么不能用BYTE呢。它这里只是存为字符而已,并未转存为字节(BYTE)格式。 难道我的不行么?貌似少了个string.h,在命令行下可以运行呀,不过要输入你要测试的文件名字 否则报错。 真心求解答,关于研发与测试 vc实现远程桌面管理软件 怪事!!WinXP下,程序编译好的exe文件,放在有些目录下可以执行,放在有些目录下双击没反应?!! 有64位的 ntohl 和 htonl 吗? DentistryDoctor(雅克医生<改行做程序员了>) 请进 关于按钮的问题 ★★如何取得Windows桌面除了任务条的矩形区域?★★ 讨论一个实际项目的具体实现 请给解答,我在线等 学mfc类是先把框架弄清楚呢,还是要掌握类的详细情况? 我发现,这两个是等价的 数据更新显示的问题
FILE* fpFile = fopen(dlg.GetPathName(), "rb");
if (!fpFile)
return ; unsigned char* bytebuff = 0;
fseek(fpFile, 0, SEEK_END);
int file_len = ftell(fpFile);
fseek(fpFile, 0, SEEK_SET); bytebuff = new unsigned char[file_len];
fread(bytebuff, file_len, 1, fpFile); m_sDisplayFile = "";
for (int i = 0; i < file_len; ++i)
{
unsigned long dw = (unsigned long)bytebuff[i];
CString str;
str.Format("%02x", dw);
m_sDisplayFile += str; }
delete bytebuff;
fclose(fpFile);
String2Hex(m_sDisplayFile);
}//将字符串转为十六进制字符串
int CKeyReaderDlg::String2Hex(CString &str)
{
int hexdata,lowhexdata;
int hexdatalen = 0;
int len=str.GetLength();
m_sendData.SetSize(len);
for(int i=0; i < len;)
{
char lstr, hstr = str[i];
i++;
if(i >= len)
break;
lstr = str[i];
hexdata = ConvertHexChar(hstr);
lowhexdata = ConvertHexChar(lstr);
if ((hexdata == 16) || (lowhexdata == 16))
break;
else
hexdata = hexdata * 16 + lowhexdata;
i++;
m_sendData[hexdatalen] = (char)hexdata;
hexdatalen++;
}
m_sendData.SetSize(hexdatalen);
return hexdatalen;
}//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CKeyReaderDlg::ConvertHexChar(char ch)
{
if ((ch >= '0 ') && (ch <= '9'))
return ch - 0x30;
else if ((ch >= 'A') && (ch <= 'F'))
return ch - 'A' + 10;
else if ((ch >= 'a') && (ch <= 'f'))
return ch - 'a' + 10;
else return (-1);
}这是我的实现方法,显然太麻烦了。。
file.Open(dlg.GetPathName(), CFile::modeRead);
file.ReadString(m_sendData);
unsigned char byTemp;
for(int i=0;i<1000;i+=2)
sscanf(strHex+i,"%x",&byTemp)类似这样
file.Open(path, CFile::modeRead); int fileSize = file.GetLength(); CString txtResult;
file.Read(txtResult.GetBuffer(fileSize+1), fileSize);
txtResult.ReleaseBuffer(fileSize); CString hexResult;
char *pBuf = hexResult.GetBuffer(fileSize*2 + 1); const char* pStr = txtResult;
while (*pStr)
{
sprintf(pBuf, "%0.2X", *pStr++);
pBuf += 2;
}
hexResult.ReleaseBuffer(fileSize<<1); file.Close();
if (!fpFile)
return ; unsigned char* bytebuff = 0;
fseek(fpFile, 0, SEEK_END);
int file_len = ftell(fpFile);
fseek(fpFile, 0, SEEK_SET); bytebuff = new unsigned char[file_len];
fread(bytebuff, file_len, 1, fpFile); m_sDisplayFile = "";
for (int i = 0; i < file_len; ++i)
{
unsigned long dw = (unsigned long)bytebuff[i];
CString str;
str.Format("%02x", dw);
m_sDisplayFile += str; }
delete bytebuff;
fclose(fpFile);
楼主,其实十六进制的文件,只是表示形式上的不同,内容一样。
1.用二进制读取。
2.每读两位存入一个BYTE。
3.把两位十六进制数转换成十进制数,即字符编码。(十六进制转十进制,需要自己写)
4.循环直至结束。
应该称为对一段字符进行编码比较合适,和Base64等差不多,只是你的要求更简单些
BYTE *pBt;
m_file.Open()
pBt = new BYTE(m_file.getLegth());
pBt = m_file.Read(m_file.getLegth());
... ... delete pBt;
然后再字符串转为十六进制数啊 如int32.parse();
十六进制再转为字节就行 Convert.ToByte();
{
char buf[1024 + 1];
char ch;
int index = 0;
FILE *fp;
memset( buf, 0x00, sizeof(buf) );
if ( ( fp = fopen( argv[1], "rb" ) ) == NULL )
{
printf( " Error\n");
return 1;
}
while ( ( ch = fgetc( fp ) ) != EOF && !feof( fp ) && index < 1024 )
{
sprintf( buf + index,"%02x\n", ch );
index += 2;
}
printf( "RE:\n%s\n", buf );
return 0;
}
试试这个可以么?关于十六进制中如何判断文件结束还是有疑问
winhex那个功能读出来就已经是
unsigned char data[xx]={0x11,0x22...};
这样了,使用相当方便
所有的计算机里的文件都是二进制的。没有什么文件是以16进制保存的。16进制显示是为了人读取方便。
字节数组?我以前没听过,以后也许会学到。我只听过字符数组比较类似。再有你在13楼问“只实现了一半,还有保存为字节数组呢”
CString m_sendData;本身就是一个无定长度的字符串数组。
m_sendData.GetAt(0)就是第1个元素。
m_sendData.GetAt(1)就是第2个元素。
……
你好,感谢回复。
计算机中的文件最终都是用0和1表示,即二进制。但是文件的编码和保存则有多种格式,ASCII,二进制(BIN),十六进制(HEX)。
字节数组,这里说的是BYTE为类型保存的数组,既然能用INT,CHAR,为什么不能用BYTE呢。
它这里只是存为字符而已,并未转存为字节(BYTE)格式。