如何使用 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,不能是别的。
我正在用 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,不能是别的。