c语言读取二进制文件,并转换成ascii字符

yandong 发布于 2012/07/11 16:00
阅读 11K+
收藏 1
这是我的代码
 char a,b;
	FILE *outFp, *inFp;
	inFp=fopen("./config/SAM","rb+");
  	if(inFp==NULL){
              printf("open in file error!\n");
              return 0;
    	}

	for(int i=0;i<120;i++)
	{
		fread(&a,sizeof(char),1,inFp);
		printf("%x ",a);
	}
	printf("\n");
	fclose(inFp);
这段代码主要使用来都一个二进制文件,并输出。原来的内容是:

7265 6766 3f00 0000 3f00 0000 3f63 3f47
可是程序读取并输出的是:
72 65 67 66 ffffffa0 0 0 0 ffffffa0 0 0 0 ffffff83 63 ffffff8b 47

这是什么原因啊????求解

加载中
0
中山野鬼
中山野鬼

%x不带符号。你这样试试

if (a < 0){
    printf("-"); a = 0 - a ;
}//加上这个。
printf("%x ",a);

0
yandong
yandong

引用来自“中山野鬼”的答案

%x不带符号。你这样试试

if (a < 0){
    printf("-"); a = 0 - a ;
}//加上这个。
printf("%x ",a);

输出的结果变成了这样,72 65 67 66 -60 0 0 0 -60 0 0 0 -7d 63 -75 47。还是不对啊,原文是这个7265 6766 3f00 0000 3f00 0000 3f63 3f47。中间有好多的3f,但是每次读取并打印的值都不一样。
中山野鬼
中山野鬼
这我就不知道了。就从你目前的代码来看是没问题的。其实我那个"-"是多余(如果你尝试把char 改成 int)。
0
中山野鬼
中山野鬼
你查下别的原因,或者把文件传给我。我帮你测一下。
0
TrulyBelieve
TrulyBelieve
printf ( "%x " ,(unsigned char)a);
0
yandong
yandong

引用来自“中山野鬼”的答案

你查下别的原因,或者把文件传给我。我帮你测一下。
怎么传给你? 那个二进制文件就是windows的注册表文件 在C:\windows\system32\config\SAM
0
中山野鬼
中山野鬼
OK。我马上测一下。用VC写个看看。
0
yandong
yandong

引用来自“TrulyBelieve”的答案

printf ( "%x " ,(unsigned char)a);
这个没用,试过了 如果用用char,就是是这样子ffffffa0
0
氵共

http://code.google.com/p/srgb/source/browse/printHexString/main.cpp

void printHexStr(const void* buf , size_t size)
{
    unsigned char* str = (unsigned char*)buf;
    char line[512] = {0};
    const size_t lineLength = 16; // 8或者32
    char text[24] = {0};
    char* pc;
    int textLength = lineLength;

    for (size_t ix = 0 ; ix < size ; ix += lineLength) {
        sprintf(line, "%.8xh: ", ix);
// 打印16进制
        for (size_t jx = 0 ; jx != lineLength ; jx++) {
            if (ix + jx >= size) {
                sprintf(line + (11 + jx * 3), "   "); // 处理最后一行空白
                if (ix + jx == size)
                    textLength = jx;  // 处理最后一行文本截断
            } else
                sprintf(line + (11 + jx * 3), "%.2X ", * (str + ix + jx));
        }
// 打印字符串
        {
            memcpy(text, str + ix, lineLength);
            pc = text;
            while (pc != text + lineLength) {
                if ((unsigned char)*pc < 0x20) // 空格之前为控制码
                    *pc = '.';                 // 控制码转成'.'显示
                pc++;
            }
            text[textLength] = '\0';
            sprintf(line + (11 + lineLength * 3), "; %s", text);
        }

        printf("%s\n", line);
    }
}

yandong
yandong
谢谢你的代码
0
中山野鬼
中山野鬼
我试了。代码本身没问题。不过你说的文件SAM。我无法进行COPY。说正在被别的程序使用。我尝试了另一个二进制文件,没有任何问题。 (当然我是用 "rb",不是“rb+")。你如果可以fopen SAM,如果还出现你说的问题。那么可以证明,这个文件本身在不停的被改写。我使用UE打开SAM,也出现文件共享错误,而禁止打开。
0
yandong
yandong

引用来自“中山野鬼”的答案

我试了。代码本身没问题。不过你说的文件SAM。我无法进行COPY。说正在被别的程序使用。我尝试了另一个二进制文件,没有任何问题。 (当然我是用 "rb",不是“rb+")。你如果可以fopen SAM,如果还出现你说的问题。那么可以证明,这个文件本身在不停的被改写。我使用UE打开SAM,也出现文件共享错误,而禁止打开。
我是复制到了linux下面,操作的,不存在共享的问题
返回顶部
顶部