我正在尝试编写一些简单的程序来将文件上传到我的服务器。我想将二进制文件转换为十六进制。我写了一些东西,但它无法正常工作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static int bufferSize = 1024;
FILE *source;
FILE *dest;
int n;
int counter;
int main() {
unsigned char buffer[bufferSize];
source = fopen("server.pdf", "rb");
if (source) {
dest = fopen("file_test", "wb");
while (!feof(source)) {
n = fread(buffer, 1, bufferSize, source);
counter += n;
strtol(buffer, NULL, 2);
fwrite(buffer, 1, n, dest);
}
}
else {
printf("Error");
}
fclose(source);
fclose(dest);
}
我使用strtol转换二进制do hex。调用此代码后,我的file_test文件中仍有奇怪的字符。
我想在服务器上上传文件,例如PDF文件。但首先我必须编写一个程序,将该文件转换为hex文件。我希望hex文件中一行的长度等于1024.之后,我会逐行上传这个文件PL/SQL。
答案 0 :(得分:1)
编辑:我完全误解了OP的目标。他想将他的pdf文件转换为十六进制表示,正如我现在看到的那样,因为他想将该文件放在某个数据库表的文本blob字段中。我仍然声称这个练习完全是浪费时间,因为blob可以包含二进制数据:这就是发明blob的原因。 Blob 表示 二进制大对象。
你说:“我想在服务器上传文件,例如pdf文件。但首先我必须编写一个程序,将该文件转换为hex文件。”
您不必, 一定不能 ,编写任何此类转换程序。
你必须首先理解并内化hex符号只是一个易于阅读的表示二进制的想法。如果您认为,您必须将pdf文件“转换”为十六进制,那么您就错了。 pdf文件是二进制文件,是二进制文件。您不会“转换”任何内容,除非您想要更改二进制文件!
您必须放弃,删除,丢弃,废弃,忘记并删除您将任何二进制文件“转换”为其他任何内容的概念。请参阅,十六进制存在 仅 作为二进制的人类可读表示格式,每个十六进制数字代表四个连续的二进制数字。
换句话说:十六进制表示仅供人类消费 ,不适合(几乎总是)用于程序使用。
举个例子:假设你的pdf文件包含一个四位字符串“1100”,其人类可读的十六进制表示可以是“C”。当你以你想要的方式将1100转换为十六进制时,你用ASCII字符'C'替换它,其十进制值是67.你可以立即看到 不是 你想做什么,你马上也看到它甚至不可能:十进制值67需要七位而不适合你的四位“1100”。
HTH
答案 1 :(得分:0)
您的代码非常混乱。
它正在读取数据,然后对其进行strtol()
调用,基数为2,然后忽略返回值。有什么意义呢?
要将第一个加载的数据字节转换为十六进制字符串,您应该使用类似的内容:
char hex[8];
sprintf(hex, "%02x", (unsigned int) buffer[0] & 0xff);
然后将hex
写入输出文件。您需要对所有加载的字节执行此操作,当然,不仅仅是buffer[0]
。
此外,作为次要问题,您在尝试阅读文件之前无法致电feof()
。最好不要使用feof()
,而是检查fread()
的返回值以检测它何时失败。
答案 2 :(得分:0)
strtol
将包含数字的十进制表示的字符串转换为二进制数。您可能希望将二进制OK
之类的内容转换为4F 4B
...为此,您可以使用sprintf(aString, "%x", aChar)
。