【问题标题】:Conversion from binary file to hex in C在C中从二进制文件转换为十六进制
【发布时间】:2012-03-06 18:24:55
【问题描述】:

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

#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 将二进制转换为十六进制。调用此代码后,我的 file_test 文件中仍有奇怪的字符。

我想在服务器上上传一个文件,例如 PDF 文件。但首先我必须编写一个程序,将这个文件转换为一个十六进制文件。我希望 hex 文件中的一行长度等于 1024。之后,我将使用 PL/SQL 逐行上传此文件。

【问题讨论】:

  • 你想要什么?你不能用十六进制编辑器读取二进制值吗?我看不出将二进制转换为人类可读的十六进制的意义。
  • strtol() 不会像您认为的那样做。阅读您的文档。
  • 使用base64格式怎么样?这是讨论stackoverflow.com/questions/342409/…
  • @2r4w -- base-64 可能对 OP 的困惑有一些理论上或切向的影响,但在他的问题的背景下没有实际帮助。

标签: c binary


【解决方案1】:

编辑:我完全误解了 OP 的目标。正如我现在所看到的,他想将他的 pdf 文件转换为十六进制表示,因为他想将该文件放在某个数据库表的文本 blob 字段中。我仍然声称这个练习完全是浪费时间,因为 blob 可以包含二进制数据:这就是 blob 的发明目的。 Blob 表示二进制大对象。

您说:“我想在服务器上上传文件,例如 pdf 文件。但首先我必须编写一个程序,将这个文件转换为 hex 文件。”

您不必也不得编写任何此类转换程序。

您必须首先理解并内化十六进制表示法只是二进制的易于阅读的表示的想法。如果您认为,正如您所想的那样,您必须将 pdf 文件“转换”为十六进制,那么您就错了。 pdf文件是二进制文件是二进制文件。你不会“转换”任何东西,除非你想更改二进制!

您必须放弃、删除、丢弃、清除、忘记和删除您将任何二进制文件“转换”为其他任何内容的概念。请看,十六进制作为人类可读的二进制表示格式存在,每个十六进制数字代表四个连续的二进制数字。

换句话说:十六进制表示仅供人类使用,不适合(几乎总是)程序使用。

例如:假设您的 pdf 文件包含一个四位字符串“1100”,其人类可读的十六进制表示可以是“C”。当您以您想要的方式将 1100“转换”为十六进制时,您将其替换为 ASCII 字符“C”,其十进制值为 67。您可以立即看到 不是 你想做什么,你立即发现它甚至是不可能的:十进制值 67 需要七位,不适合你的四位“1100”。

HTH

【讨论】:

  • 嗨,我的任务是加快文件上传到服务器的速度。在我们的解决方案中,有人编写了一个程序,将文件的十六进制表示形式作为 blob 上传到数据库中。不幸的是,程序创建的每一行文件只有256B。我希望那条线路有 1024B。为了从数据库中读取文件,我们使用逆向程序,它从十六进制文件中获取二进制表示。
  • 那我应该写 hexdump 之类的东西吗?
  • 哦,现在我明白了。您的代码中有错误,您希望有人为您找到它。一个错误是:您进行二进制到十六进制转换的方法是错误的。您必须从 pdf 文件中读取每个四位块,从头开始;将该四位块转换为其十六进制字符表示;将十六进制字符存储在输出缓冲区中;并继续 pdf 中的所有四位 nybbles。我不知道你想用 strtoul() 来完成什么,但你不会。 @unwind 给了你一个答案,你应该研究一下以了解解决方案。
  • @user987903 我也很困惑,如何来回进行这种转换“加速将文件上传到服务器”?正如皮特在这里所说,只需将二进制文件粘贴到您的 blob 中(结果不正确)。也许我错过了重点
【解决方案2】:

您的代码非常混乱。

它正在读取数据,然后对其进行strtol() 调用,基数为 2,然后忽略返回值。这样做有什么意义?

要将第一个加载的数据字节转换为十六进制字符串,您可能应该使用类似:

char hex[8];

sprintf(hex, "%02x", (unsigned int) buffer[0] & 0xff);

然后将hex 写入输出文件。当然,您需要对所有加载的字节执行此操作,而不仅仅是 buffer[0]

另外,作为一个小问题,您不能在尝试读取文件之前调用feof()。最好不要使用feof(),而是检查fread()返回值,以检测何时失败。

【讨论】:

  • 我想在服务器上上传文件,例如 pdf 文件。但首先我必须编写一个程序,将这个文件转换为十六进制文件。我希望 hex 文件中的行长度等于 1024。之后我将使用 plsql 逐行上传这个文件。很抱歉,我对 C 语言不是很熟悉。
  • for (i=0;i
【解决方案3】:

strtol 如果我没记错的话,会将包含数字十进制表示的字符串转换为二进制数。您可能希望将二进制文件OK 转换为4F 4B...例如,您可以使用sprintf(aString, "%x", aChar)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2019-03-24
    • 2018-11-18
    • 2012-03-26
    • 2016-06-05
    • 2018-11-24
    相关资源
    最近更新 更多