开发者社区> 问答> 正文

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

这是我的代码
 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

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

展开
收起
kun坤 2020-06-06 22:28:45 1183 0
1 条回答
写回答
取消 提交回答
  • %x不带符号。你这样试试

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

    ######

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

    %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)。######你查下别的原因,或者把文件传给我。我帮你测一下。
    ###### printf ( "%x " ,(unsigned char)a);######

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

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

    引用来自“TrulyBelieve”的答案

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

    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);
        }
    }

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

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

    我试了。代码本身没问题。不过你说的文件SAM。我无法进行COPY。说正在被别的程序使用。我尝试了另一个二进制文件,没有任何问题。 (当然我是用 "rb",不是“rb+")。你如果可以fopen SAM,如果还出现你说的问题。那么可以证明,这个文件本身在不停的被改写。我使用UE打开SAM,也出现文件共享错误,而禁止打开。
    我是复制到了linux下面,操作的,不存在共享的问题
    2020-06-06 22:28:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载