簡體   English   中英

在C中從二進制文件轉換為十六進制

[英]Conversion from binary file to hex in C

我正在嘗試編寫一些簡單的程序來將文件上傳到服務器。 我想將二進制文件轉換為十六進制。 我寫了一些東西,但是不能正常工作。

#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文件。 但是首先,我必須編寫一個程序,將該文件轉換為十六進制文件。 我希望十六進制文件中的一行的長度等於1024。之后,我將使用PL / SQL逐行上傳此文件。

編輯:我完全誤解了OP的目標。 如我現在所見,他希望將pdf文件轉換為其十六進制表示形式,因為他希望將該文件放入某個數據庫表的text blob字段中。 我仍然聲稱該練習完全浪費時間,因為blob可能包含二進制數據:這就是blob發明的目的。 Blob 表示二進制大對象。

您說:“我想將文件上傳到服務器上,例如pdf文件。但是首先,我必須編寫一個程序,它將該文件轉換為十六進制文件。”

您不必也不應該編寫任何此類轉換程序。

您必須首先了解並內化十六進制表示法只是二進制的一種易於閱讀的表示形式的思想。 如果您似乎認為必須將pdf文件“轉換”為十六進制,那么您就錯了。 pdf文件是二進制文件,是二進制文件。 您無需“轉換”任何東西,除非您想更改二進制文件!

您必須放棄,刪除,丟棄,修飾,忘記和刪除將任何二進制文件“轉換”為其他文件的概念。 參見,十六進制作為人類可讀的二進制表示形式存在,每個十六進制數字代表四個連續的二進制數字。

換句話說,十六進制表示形式僅供人類使用 ,不適合(幾乎總是)適合程序使用。

例如:假設您的pdf文件包含一個四位字符串“ 1100”,其人類可讀的十六進制表示形式可以為“ C”。 當您將“ 1100”“轉換”為所需的十六進制格式時,將其替換為ASCII字符“ C”,其十進制值為67。您可以立即看到這不是您想要的內容,您會立即看到同樣,這甚至是不可能的:十進制值67需要7位,並且不適合您的“ 1100”的4位。

高溫超導

您的代碼非常混亂。

它正在讀取數據,然后以2為底數對其進行strtol()調用,然后忽略返回值 這有什么意義?

要將數據的第一個加載字節轉換為十六進制字符串,您可能應該使用類似以下內容的方法:

char hex[8];

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

然后將hex寫入輸出文件。 當然,您需要對所有加載的字節執行此操作,而不僅僅是buffer[0]

另外,作為次要點,嘗試讀取文件之前不能調用feof() 最好不要使用feof() ,而應檢查fread()返回值以檢測其失敗時間。

如果我沒有記錯的話, strtol將包含數字的十進制表示形式的字符串轉換為二進制數字。 您可能想將二進制OK轉換為4F 4B ...為此,您可以使用sprintf(aString, "%x", aChar)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM