读取图像文件十六进制值并打印到文件

时间:2013-12-09 08:58:45

标签: c

我从不擅长C,从书中学习。我一直在网上搜索如何读取和写入十六进制值,但我找不到我要找的东西。

基本上我想读取像jpg这样的图像文件并逐字写入文件,但是我的代码没有这样做。

#include<stdio.h>
int main()
{
    unsigned long txt;
    FILE *myimg, *img;

    myimg=fopen("myimg.jpg","w");
    fclose(myimg);
    myimg=fopen("myimg.jpg","rb+");
    img=fopen("img.jpg","rb");txt=0;
    printf("Start");
    while(!feof(img))
    {
        if(img==NULL)
        {
            printf("WTF1");
        }
        txt=fgetc(img);
        fprintf(myimg,"%x",txt);
    }
    return(0);
}

输出文件的大小不同,当我在十六进制编辑器中查看它时,没有相似之处。你能告诉我它是如何完成的吗?

2 个答案:

答案 0 :(得分:2)

假设CHAR_BITS==8,每个char持有[0..255]范围内的值(如果签名,则为[-128..127])。这由十六进制表示为[0x00..0xff]。 0到15之间的值可以用单个字符表示为十六进制;其他值需要两个字符才能将单个char表示为十六进制。

fprintf(myimg,"%x",txt);

char的值写为十六进制。对于[0..15]范围之外的值,它需要写入2个字符来表示单个char。 (例如,如果txt==16,将其格式化为十六进制会将字符1然后0写入文件。)

您需要使用%c格式说明符

fprintf(myimg,"%c",txt);

或者,如果您使用fputc

,则会更清楚
fputc(myimg,txt);

答案 1 :(得分:0)

您所写的内容与您所阅读的内容不同。 你读了一个字符,但是你在文本模式中写了一个很长的值,它们是完全不同的。 如果在普通文本编辑器中打开输出文件并在十六进制编辑器中打开输入文件,它们应该看起来相同。 只需使用fputc()而不是fprintf,你应该得到你想要的东西。