如何使用 fread() 在 C 中读取和传输 PDF 文件

How to read and transfer PDF files in C with fread()

我正在用 C 编写 TFTP 客户端。到目前为止,我可以毫无问题地将文件读入缓冲区 (512 B) 并将其传输到服务器。但是,我很难读取包含二进制数据的 PDF 等文件。

        size_t nmemb = fread(data_buf, sizeof(char), 512, fp);
        ...
        /* Create DATA packet and send it to TFTP server */ 
        count = sprintf(message, "%c%c%c%c%s", 0, DATA, 0, block_number, data_buf); 
        sendto(sock, message, count, 0, (const struct sockaddr *)&server, sizeof(server));

我通过分别打印每个缓冲区进行了测试:printf("%d: %s\n", nmemb, data_buf); 看起来 nmemb 总是 512,这是正确的,但是 printf() 在到达第一个 NULL 字节时停止打印数据,我确定它代表给定字符串(缓冲区)的结尾。

通过 TFTP 协议发送的 DATA 数据包中的缓冲区数据也会在第一次出现 NULL 字节时被切断 - 我在 Wireshark 中对此进行了测试。

有没有办法通过使用 fread() 的替代方法或更改通过套接字发送数据包的方式来解决此问题?感谢您的回答。

您不能为此使用 printf 系列函数,因为它们会在遇到 [=13=] 时停止。

第一种方法:使用memcpy:

size_t nmemb = fread(data_buf, 1, sizeof data_buf, fp);

char message[sizeof data_buf + 4]; // presumably

count = sprintf(message, "%c%c%c%c", 0, DATA, 0, block_number);
memcpy(message + count, data_buf, nmemb);

第二种方法(首选方法):避免复制并 fread 直接进入稍后发送的缓冲区:

char message[512 + 4] = {0, DATA, 0, block_number};
size_t nmemb = fread(message + 4, 1, 512, fp);
sendto(sock, message, nmemb + 4, 0, (const struct sockaddr *)&server, sizeof(server))

注意:sizeof(char)永远是1,不能是别的。