2012-02-15 3 views
1

Я пытаюсь написать простую программу для загрузки файлов на свой сервер. Я хотел бы преобразовать двоичные файлы в hex. Я что-то написал, но он работает неправильно.Преобразование из двоичного файла в hex в 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.

+0

Что вы хотите иметь? Не можете ли вы просто прочитать двоичные значения с помощью шестнадцатеричного редактора? Я бы не понял смысла в преобразовании двоичного кода в человеко-читаемый гекс. – guitarflow

+1

'strtol()' не делает то, что вы думаете. Прочтите свою документацию. – Blastfurnace

+0

Как насчет использования формата base64? здесь обсуждение http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c – 2r2w

ответ

0

Ваш код фантастически запутан.

Он считывает данные, затем делает звонок strtol() с базой 2, а затем игнорирует возвращаемое значение. В чем смысл?

Чтобы преобразовать первый загруженный байт данных шестнадцатеричной строки, вы, вероятно, следует использовать что-то вроде:

char hex[8]; 

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

Затем написать hex в выходной файл. Вы должны сделать это для всех загруженных байтов, конечно, не только buffer[0].

Кроме того, в качестве второстепенной точки вы не можете позвонить feof(), прежде чем пытаетесь прочитать файл. Лучше не использовать feof() и вместо этого проверить возвращаемое значение из fread(), чтобы определить, когда он не работает.

+0

Я бы хотел загрузить файл на сервер, например pdf-файл. Но, во-первых, я должен написать программу, которая преобразует этот файл в шестнадцатеричный файл. Мне бы хотелось, чтобы длина строки в шестнадцатеричном файле была равна 1024. После этого я загружу этот файл по строкам с помощью plsql. Мне жаль, но я не очень опытен с C. – matyyyy

+0

для (i = 0; i matyyyy

0

strtol преобразует строку, содержащую десятичное представление числа в двоичное число, если я не ошибаюсь. Вероятно, вы хотите конвертировать что-то вроде двоичного файла OK в 4F 4B ... Для этого вы можете использовать, например, sprintf(aString, "%x", aChar).

1

EDIT: Я совершенно не понял, к чему стремился ОП. Он хочет преобразовать свой pdf-файл в шестнадцатеричное представление, как я вижу сейчас, потому что он хочет поместить этот файл в текстовое поле blob в какую-нибудь таблицу базы данных. Я все еще утверждаю, что упражнение - это полная трата времени, поскольку blobs могут содержать двоичные данные: это то, для чего были изобретены blobs. Blob средства бинарный большой объект.

Вы сказали: «Я хочу загрузить файл на сервер, например, в pdf-файл. Но сначала мне нужно написать программу, которая преобразует этот файл в шестнадцатеричный файл».

Вы не должны, и не должны, писать такую ​​программу преобразования.

Вы должны сначала понять и усвоить идею о том, что шестнадцатеричная нотация - это простое чтение , представляющее двоичный код. Если вы думаете, как вам кажется, что вам нужно «преобразовать» файл pdf в hex, тогда вы ошибаетесь. Файл pdf является двоичным файлом - это двоичный файл. Вы ничего не «конвертируете», если не хотите, чтобы изменить двоичный код!

Вы должны отказаться, удалить, отбросить, обезобразить, забыть и исключить свое понятие о «преобразовании» любого двоичного файла в другое. См., Hex существует только как удобочитаемый формат представления для двоичного кода, каждая шестнадцатеричная цифра представляет четыре смежных двоичных разряда.

Говоря иначе: шестнадцатеричный для потребления человеком только, непригодны (почти всегда) для использования программы.

Пример: предположим, что ваш файл PDF содержит четырехбитную строку «1100», чье человеко-читаемое шестнадцатеричное представление может быть «C». Когда вы «конвертируете» это 1100 в шестнадцатеричный, как вы хотите это сделать, вы заменяете его символом ASCII «C», десятичным значением которого является 67. Вы можете сразу увидеть, что не что вы хотите сделать и вы сразу же увидите, что это даже не возможно: десятичное значение 67 требует семи бит и не будет вписываться в ваши четыре бита «1100».

HTH

+0

Привет, Моя задача - ускорить загрузку файлов на сервер. В нашем решении кто-то написал программу, которая загружает шестнадцатеричное представление файла в базу данных как blob. К сожалению, каждая строка файла, созданная программой, имеет только 256B. Я бы хотел, чтобы эта линия имела 1024B. Чтобы прочитать файл из базы данных, мы используем обратную программу, которая получает двоичное представление из шестнадцатеричного файла. – matyyyy

+0

Так что я должен написать что-то вроде hexdump? – matyyyy

+1

О, теперь я понимаю. У вас есть ошибка в коде, и вы хотите, чтобы кто-то нашел его для вас. Одна ошибка заключается в следующем: ваш подход к преобразованию двоичного кода в шестнадцатеричный. Вы должны прочитать каждый четырехбитовый фрагмент из файла pdf, начиная с самого начала; конвертировать этот четырехбитовый фрагмент в шестнадцатеричное представление; хранить шестнадцатеричный символ в вашем выходном буфере; и продолжить для всех четырехбитных nybbles в pdf. Я не знаю, что вы пытаетесь выполнить с помощью strtoul(), но вы этого не сделаете. @unwind дал вам ответ, который вы должны изучить, чтобы понять какое-то решение. –

Смежные вопросы