例如有一个二进制文件,前面几个字节是:
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
我现在想在每一次循环中依次取4字节,做为一个十六进制值。
例如:第一次取值是0xAC521D67 而不是"AC521D67"
第二次取值是0x9BCEBF11
第三次取值是0x38D1C2B5这样的程序应该怎么做呀?
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
我现在想在每一次循环中依次取4字节,做为一个十六进制值。
例如:第一次取值是0xAC521D67 而不是"AC521D67"
第二次取值是0x9BCEBF11
第三次取值是0x38D1C2B5这样的程序应该怎么做呀?
然后通过
%08x来格式化
DWORD dwWord;
................
m_File.Read(dwWord,4);这样从文件里读出4字节大小放到dwWord吗??
程序执行到这里的时候就出错了。
ASSERT(inBin); int length;
char * buffer;
// get length of file:
inBin.seekg (0, ios::end);
length = inBin.tellg();
inBin.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
inBin.read (buffer,length);
DWORD *dwData = (DWORD *)buffer;
int nWorkingLength;
nWorkingLength = length/4; DWORD dwResult;
TCHAR szResult[1024];
for (int i = 0; i < nWorkingLength; i++)
{
dwResult = * (dwData+i);
sprintf(szResult,_T("%d:0x%x"),i, dwResult);
}
Debug Assertion Failed!
For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts;
m_File.Read((char *)buf,4);DWORD dwWord;dwWord=buf[0];
dwWork<<=4;
dwWord+=buf[1];
dwWork<<=4;
dwWord+=buf[2];
dwWork<<=4;
dwWord+=buf[3];
m_File.Read((char *)buf,4);DWORD dwWord;dwWord=buf[0];
dwWork<<=8;
dwWord+=buf[1];
dwWork<<=8;
dwWord+=buf[2];
dwWork<<=8;
dwWord+=buf[3];
恩,我在定义DWORD的时候是定义指针类型的,写上来写错了。呵呵。。还有,你那种位移的方法很好。但因为是单个字节处理的,所以在速度上可能有些慢。谢谢你。朋友。
[code]
ifstream inBin(_T("xxx.bin"),ios::in|ios::binary); //二进制打开文件
ASSERT(inBin); //是否正常打开 int length;
char * buffer;
// get length of file:
inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
length = inBin.tellg(); //这!!
inBin.seekg (0, ios::beg); //文件指针又到开始位置?
// allocate memory:
buffer = new char [length];
// read data as a block:
inBin.read (buffer,length);
DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的
int nWorkingLength;
nWorkingLength = length/4; DWORD dwResult;
TCHAR szResult[1024];
for (int i = 0; i < nWorkingLength; i++)
{
dwResult = * (dwData+i);
sprintf(szResult,_T("%d:0x%x"),i, dwResult); //这样的话szResult不也是字符型的吗?
}[/code]不太清楚你用的什么类.可以指教下吗?
ifstream inBin(_T("xxx.bin"),ios::in|ios::binary); //二进制打开文件
ASSERT(inBin); //是否正常打开 int length;
char * buffer;
// get length of file:
inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
length = inBin.tellg(); //这!!
inBin.seekg (0, ios::beg); //文件指针又到开始位置?
// allocate memory:
buffer = new char [length];
// read data as a block:
inBin.read (buffer,length);
DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的
int nWorkingLength;
nWorkingLength = length/4; DWORD dwResult;
TCHAR szResult[1024];
for (int i = 0; i < nWorkingLength; i++)
{
dwResult = * (dwData+i);
sprintf(szResult,_T("%d:0x%x"),i, dwResult); //这样的话szResult不也是字符型的吗?
}
不太清楚你用的什么类.可以指教下吗?
我用[C ODE]和[/ C ODE]后代码为什么就没了啊?
ASSERT(inBin); //是否正常打开 int length;
char * buffer;
// get length of file:
inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
length = inBin.tellg(); //这!!
inBin.seekg (0, ios::beg); //文件指针又到开始位置? //把文件指针放到end后获取位置,在还原到开始位置已被之后读取做准备
// allocate memory:
buffer = new char [length];
// read data as a block:
inBin.read (buffer,length);
DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的//指针类型的转换
int nWorkingLength;
nWorkingLength = length/4; DWORD dwResult;
TCHAR szResult[1024];
for (int i = 0; i < nWorkingLength; i++)
{
dwResult = * (dwData+i);
sprintf(szResult,_T("%d:0x%x"),i, dwResult); //这样的话szResult不也是字符型的吗?//类型是表现在输出格式上的也就是字串,计算机中数据都是二进制表示的。
}
不太清楚你用的什么类.可以指教下吗?
我用[C ODE]和[/ C ODE]后代码为什么就没了啊?
m_File.Read((char *)buf,4);
DWORD dwVal=buf[0]<<12+buf[1]<<8+buf[2]<<4+buf[3];//dwVal是你要取的16进制值
是字符串还是二进制数据?
我怎么觉得按照楼主的意思是字符串呢?(用记事本打开看到的东西)
像PE格式文件,用记事本打开后不全是乱码么?
如果用WinHex打开的话,左边的全是以16进制来显示的。
我想能不能一次读出4字节,例如:第一次读出来的就是0xAC521D67,而不是"AC521D67"