将十六进制表示写入文件

时间:2012-02-21 22:09:39

标签: c

在我的程序中,我试图从二进制文件中读取数据,然后将它的十六进制表示写入txt文件。

#include <stdio.h>
#include <stdlib.h>

int counter = 0;
int read;
int i = 0;
long size;
FILE *file1 = NULL; 
FILE *file2 = NULL; 
fpos_t length;
char newLine = '\n';

int main(int argc, char **argv) {

    if (argc < 2) {
    printf("Use: %s file1 file2", argv[0]);
    exit (-1);
    }

    unsigned char hex[513];
    unsigned char buffer[257];
    file1 = fopen(argv[1], "rb");
    fseek(file1, 0, SEEK_END);
    fgetpos(file1, &length);
    size = length.__pos;
    fseek(file1, 0, SEEK_SET); 
    if (file1) {
            file2 = fopen(argv[2], "w");
            if (!file2) {
                    printf("Cannot open file: %s\n", argv[2]);
                    exit(-1);
            }
            while (counter < size) {
                    read = fread(buffer, 1, 256, file1);
                    counter += read;
                    i = 0;
                    while (i < read) {
                            sprintf(hex, "%02x",  buffer[i++]);
                    }
                    fwrite(hex, 1, 512, file2);
                    fwrite(&newLine, 1, 1, file2);
                    }
    } else
           printf("Cannot open file %s\n", argv[1]);
    fclose(file1);
    fclose(file2);
}

不幸的是,数据无法正确写入txt文件。请帮我找出错误。这段代码有什么问题?

2 个答案:

答案 0 :(得分:3)

问题的一部分是sprintf调用会覆盖hex中的任何内容。它没有附加到它。因此,结果是它将该缓冲区的完整大小写入文件,但它只有最后一个十六进制值(在前2个字节中)。

答案 1 :(得分:1)

这是你的(主要)问题:

while (i < read) {
  sprintf(hex, "%02x",  buffer[i++]);                     
} 

您不是buffer[i++]的十六进制表示附加到hex,而是覆盖 hex中的内容。

这是解决这个问题的方法之一(略带hackish和丑陋):

usigned char *hp = hex;
...
while (i < read) {
  sprintf(hp, "%02x", buffer[i++]);
  hp+=2;      
}

hp最初指向hex的开头;每次循环时,都会将其前进两个位置,以便每个sprintf 附加到hex

请注意,无论您实际存储多少个值,sizeof(hex) 总是评估为513。如果您要尝试指示每行写入了多少个字符,最好写2*read