读一个二进制文件,并且是每4个字节组合在一起作为16进制形式

隐身 2010-09-14 02:15:02
例如有一个二进制文件,前面几个字节是:
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
我现在想在每一次循环中依次取4字节,做为一个十六进制值。
例如:第一次取值是0xAC521D67 而不是"AC521D67"
第二次取值是0x9BCEBF11
第三次取值是0x38D1C2B5

这样的程序应该怎么做呀?
...全文
293 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
shakaqrj 2010-09-15
  • 打赏
  • 举报
回复
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
是字符串还是二进制数据?
我怎么觉得按照楼主的意思是字符串呢?(用记事本打开看到的东西)
shakaqrj 2010-09-15
  • 打赏
  • 举报
回复
那就向上面所说的,一次读取四个字节,然后颠倒字节啊
隐身 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 shakaqrj 的回复:]
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
是字符串还是二进制数据?
我怎么觉得按照楼主的意思是字符串呢?(用记事本打开看到的东西)
[/Quote]

像PE格式文件,用记事本打开后不全是乱码么?
如果用WinHex打开的话,左边的全是以16进制来显示的。
我想能不能一次读出4字节,例如:第一次读出来的就是0xAC521D67,而不是"AC521D67"
隐身 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liberty724048 的回复:]
BYTE buf[4];
m_File.Read((char *)buf,4);
DWORD dwVal=buf[0]<<12+buf[1]<<8+buf[2]<<4+buf[3];//dwVal是你要取的16进制值
[/Quote]

我目前也是通过位移来一字节一字节处理的,我想能不能读出来就是4个字节的十六进制呢?
Liberty-Bird 2010-09-14
  • 打赏
  • 举报
回复
BYTE buf[4];
m_File.Read((char *)buf,4);
DWORD dwVal=buf[0]<<12+buf[1]<<8+buf[2]<<4+buf[3];//dwVal是你要取的16进制值
ZM 2010-09-14
  • 打赏
  • 举报
回复
  ifstream inBin(_T("xxx.bin"),ios::in|ios::binary); //二进制打开文件    Yes
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]后代码为什么就没了啊?
隐身 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zeming_gu 的回复:]
C/C++ 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);
lengt……
[/Quote]

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]后代码为什么就没了啊?
隐身 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zeming_gu 的回复:]
C/C++ 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);
lengt……
[/Quote]


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不也是字符型的吗?
}



不太清楚你用的什么类.可以指教下吗?
隐身 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vnking 的回复:]
m_File.Read(dwWord,4);

肯定是错的,至少也要写成:

m_File.Read(&dwWord,4);

不过这样的话,dwWord=0x671D52AC, 而不是:0xAC521D67
[/Quote]

恩,我在定义DWORD的时候是定义指针类型的,写上来写错了。呵呵。。

还有,你那种位移的方法很好。但因为是单个字节处理的,所以在速度上可能有些慢。

谢谢你。朋友。
vnking 2010-09-14
  • 打赏
  • 举报
回复
更正:应该是左移8位:



unsigned char buf[4];
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];

vnking 2010-09-14
  • 打赏
  • 举报
回复
m_File.Read(dwWord,4);

肯定是错的,至少也要写成:

m_File.Read(&dwWord,4);

不过这样的话,dwWord=0x671D52AC, 而不是:0xAC521D67
vnking 2010-09-14
  • 打赏
  • 举报
回复


unsigned char buf[4];
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];


隐身 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shenyi0106 的回复:]
什么错?
[/Quote]

Debug Assertion Failed!
For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts;
西湖秀才 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jennyvenus 的回复:]
读进来,然后htonl搞定。
[/Quote]
智能卡这个老兔子的两只大耳朵,每回看见我都想揪两下!O(∩_∩)O哈哈~!
用户 昵称 2010-09-14
  • 打赏
  • 举报
回复
读进来,然后htonl搞定。
ZM 2010-09-14
  • 打赏
  • 举报
回复
	ifstream inBin(_T("xxx.bin"),ios::in|ios::binary);
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);
}
shenyi0106 2010-09-14
  • 打赏
  • 举报
回复
什么错?
隐身 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenyi0106 的回复:]
按一个DWORD类型读出来
然后通过
%08x来格式化
[/Quote]

DWORD dwWord;
................
m_File.Read(dwWord,4);这样从文件里读出4字节大小放到dwWord吗??
程序执行到这里的时候就出错了。
shenyi0106 2010-09-14
  • 打赏
  • 举报
回复
按一个DWORD类型读出来
然后通过
%08x来格式化

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧