c/c++ 打开十六进制的文件 并以十进制输出
#include<stdio.h>#include<string.h>voidmain(){FILE*fp;chartemp[128];chartep_no[4];mem...
#include <stdio.h>
#include <string.h>
void main()
{ FILE *fp;
char temp[128];
char tep_no[4];
memset(temp,'\0',sizeof(temp));
memset(tep_no,'\0',sizeof(tep_no));
fp=fopen("abc.DRM","rb");
fread(temp,1,127,fp);
strncpy(tep_no,temp,4);
printf("%ld\n",*(long*)tep_no);
fclose(fp);}
我有一个文件是用UE打开的,里面都是十六进制的数据 比如:23 D4 45 AE ……
我想将里面四个字节为一组作为输出,但是是以十进制的形式。但是编译结果总警告说fread的问题。还想问一下一个程序中又有c的常用语句也有c++的表达可以么。我上面的程序完全不对的话应该是什么。谢谢。希望大家真诚回答。 展开
#include <string.h>
void main()
{ FILE *fp;
char temp[128];
char tep_no[4];
memset(temp,'\0',sizeof(temp));
memset(tep_no,'\0',sizeof(tep_no));
fp=fopen("abc.DRM","rb");
fread(temp,1,127,fp);
strncpy(tep_no,temp,4);
printf("%ld\n",*(long*)tep_no);
fclose(fp);}
我有一个文件是用UE打开的,里面都是十六进制的数据 比如:23 D4 45 AE ……
我想将里面四个字节为一组作为输出,但是是以十进制的形式。但是编译结果总警告说fread的问题。还想问一下一个程序中又有c的常用语句也有c++的表达可以么。我上面的程序完全不对的话应该是什么。谢谢。希望大家真诚回答。 展开
5个回答
展开全部
你的程序从语法上没有问题,编译时应该没错误,但执行时,提示fread问题,可能是找不到文件,也就是说fp==NULL,所以你最好将程序做点修改,加上出错处理:
if ((fp = fopen("abc.DRM","rb"))==NULL)
{
fprintf("\n文件打开错误");
}
else
{
……
}
还有,你可能得不到想要的结果,原因是这样:
1.读出的四个字节,数据是:23 D4 45 AE,而不是23 D4;不知你的原意是否如此?
2.*(long*)tep_no强制转换时,数据会是0xAE45D423对应的十进制数,原因是系统中数据是逆序的,即低字节在前,高字节在后。所以你要做换序处理。
if ((fp = fopen("abc.DRM","rb"))==NULL)
{
fprintf("\n文件打开错误");
}
else
{
……
}
还有,你可能得不到想要的结果,原因是这样:
1.读出的四个字节,数据是:23 D4 45 AE,而不是23 D4;不知你的原意是否如此?
2.*(long*)tep_no强制转换时,数据会是0xAE45D423对应的十进制数,原因是系统中数据是逆序的,即低字节在前,高字节在后。所以你要做换序处理。
追问
我其实有一个完整的程序 只是想将其中更加完善 你说系统中数据是逆序的 这是怎么回事儿 恩 其实数据之间没有空格 我要的就是23 D4 45 AE
追答
逆序就是:tep_no[4]=“23 D4 45 AE”
但*(long*)tep_no=0xAE45D423
展开全部
参考下,如果数据彼此是用空格分开,下面程序能执行计算任务
#include <stdio.h>
#include <string.h>
#define N 4//定义每4个字节进行累加
void main()
{
FILE *fp;
//char temp[128];
//char tep_no[4];
int v,x[N],i=0,sum=0;
//memset(temp,'\0',sizeof(temp));
memset(x,0,sizeof(x));
if((fp=fopen("b.in","rb"))!=NULL)
{
//fread(temp,1,127,fp);
//strncpy(tep_no,temp,4);
//printf("%ld\n",*(long*)tep_no);
fscanf(fp,"%x",&v);//一次读入一个数值,利用数据之间是空格
while(!feof(fp))//没有到文件末尾
{
sum=0;//每次置sum为0
for(i=0;!feof(fp)&&i<N;i++)
{
x[i]=v;//将数值取出
sum<<=8;//左移8位数,转换成高位
sum+=v;//加入地位
fscanf(fp,"%x",&v);
}
printf("%x\n",sum);//用十六进制显示累加和是否和文件信息匹配
//printf("%d\n",sum);//十进制显示
}
fclose(fp);
}
}
#include <stdio.h>
#include <string.h>
#define N 4//定义每4个字节进行累加
void main()
{
FILE *fp;
//char temp[128];
//char tep_no[4];
int v,x[N],i=0,sum=0;
//memset(temp,'\0',sizeof(temp));
memset(x,0,sizeof(x));
if((fp=fopen("b.in","rb"))!=NULL)
{
//fread(temp,1,127,fp);
//strncpy(tep_no,temp,4);
//printf("%ld\n",*(long*)tep_no);
fscanf(fp,"%x",&v);//一次读入一个数值,利用数据之间是空格
while(!feof(fp))//没有到文件末尾
{
sum=0;//每次置sum为0
for(i=0;!feof(fp)&&i<N;i++)
{
x[i]=v;//将数值取出
sum<<=8;//左移8位数,转换成高位
sum+=v;//加入地位
fscanf(fp,"%x",&v);
}
printf("%x\n",sum);//用十六进制显示累加和是否和文件信息匹配
//printf("%d\n",sum);//十进制显示
}
fclose(fp);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序在vs2010下编译通过,并可以运行。c++是兼容c的,绝大部分c语句可在c++里使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序从语法上没有问题,编译时应该没错误,但执行时,提示fread问题,可能是找不到文件,也就是说fp==NULL,所以你最好将程序做点修改,加上出错处理:
if ((fp = fopen("abc.DRM","rb"))==NULL)
{
fprintf("\n文件打开错误");
}
else
{
……
}
还有,你可能得不到想要的结果,原因是这样:
1.读出的四个字节,数据是:23 D4 45 AE,而不是23 D4;不知你的原意是否如此?
2.*(long*)tep_no强制转换时,数据会是0xAE45D423对应的十进制数,原因是系统中数据是逆序的,即低字节在前,高字节在后。所以你要做换序处理。
if ((fp = fopen("abc.DRM","rb"))==NULL)
{
fprintf("\n文件打开错误");
}
else
{
……
}
还有,你可能得不到想要的结果,原因是这样:
1.读出的四个字节,数据是:23 D4 45 AE,而不是23 D4;不知你的原意是否如此?
2.*(long*)tep_no强制转换时,数据会是0xAE45D423对应的十进制数,原因是系统中数据是逆序的,即低字节在前,高字节在后。所以你要做换序处理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询