gpt4 book ai didi

c - Printf 丢失文件中的前两个值

转载 作者:行者123 更新时间:2023-11-30 19:12:57 25 4
gpt4 key购买 nike

我已成功打开一个二进制文件 (jpg) 并将其内容复制到另一个新文件中。但是,当我打印出原始文件的内容时, printf 丢失了前两个十六进制值。

例如,example.jpg 在十六进制编辑器中打开时以“FFD8FFE0”开头当我将其复制到新文件时,它被正确复制。但是,当我将内容打印到 IDE 中的终端时,它打印“D8FFE0”,前两个“FF”去哪里了?

我尝试将 fseek(pfile1, 0, SEEK_SET) 调整为fseek(pfile1, -1, SEEK_SET) 但这输出全零,所以我不确定可能是什么问题。

我还尝试了 do...while 循环而不是 for 循环,希望我可以获得原始迭代来获得 FF,但这没有用。

我还尝试将 ch = fread(...) 中的 bugger 操纵到 buffer-1,但这不起作用。

最后,我尝试在 char 缓冲区上使用 malloc,如下所示:无符号字符*缓冲区= malloc(6000000*sizeof(无符号字符));但这也无助于获取前两位数字。

int main(int argc, const char * argv[]) {
FILE * pFile1 = fopen("example.jpg", "rb");
unsigned char buffer[6000000] = {0};
FILE * pFile2 = fopen("outputExample.jpg", "wb");
char ch;
unsigned long fileLen;
unsigned long counter;

fseek(pFile1, 0, SEEK_END);
fileLen=ftell(pFile1); // get the exact size of the pic
fseek(pFile1, 0, SEEK_SET);

for(counter=0; counter<fileLen; counter++)
{
fputc(fgetc(pFile1),pFile2);

ch = fread(buffer, sizeof(char), 6000000, pFile1);
printf("%02x", buffer[counter]);
}


fclose(pFile1);
fclose(pFile2);

return 0;
}

最佳答案

如果我们将您的代码改造成一个简单的文件复制实用程序,这是否会给您一个真正想做的自定义操作的起点:

#include <stdio.h>
#include <assert.h>

#define BUFFER_SIZE (1024 * 1024)

int main(int argc, const char *argv[]) {
FILE *pFile1 = fopen(argv[1], "rb");
FILE *pFile2 = fopen(argv[2], "wb");

unsigned char buffer[BUFFER_SIZE];
long fileLen;

fseek(pFile1, 0, SEEK_END);
fileLen = ftell(pFile1); // get the exact size of the pic
fseek(pFile1, 0, SEEK_SET);

for (size_t counter = 0; counter < fileLen;)
{
size_t bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, pFile1);
size_t bytes_written = fwrite(buffer, sizeof(char), bytes_read, pFile2);

assert(bytes_read == bytes_written);

if (counter == 0)
{
printf("%2x\n", (((unsigned short) buffer[1]) << 8) | buffer[0]);
}

counter += bytes_written;
}

fclose(pFile2);
fclose(pFile1);

return 0;
}

我增强了这个简单的文件复制程序,以十六进制输出前两个字节:

> od -x original.jpg | head -1
0000000 d8ff e0ff 1000 464a 4649 0100 0001 0100
> ./a.out original.jpg duplicate.jpg
d8ff
>

JPEG 的文件签名之一是 FFD8FFE0,因此我们看到(小端)交换字节。

关于c - Printf 丢失文件中的前两个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com