在C中从二进制文件转换为十六进制

时间:2012-02-15 11:56:50

标签: c binary

我正在尝试编写一些简单的程序来将文件上传到我的服务器。我想将二进制文件转换为十六进制。我写了一些东西,但它无法正常工作。

#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

3 个答案:

答案 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)