Как преобразовать файл изображения * .jpg в шестнадцатеричный код в C? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь прочитать файл изображения JPG и преобразовать его в строку шестнадцатеричного кода (не шестнадцатеричного пикселя) в C.

Что-то вроде:

FFD8FFE000114A464946000102030405060708090AFFDB00... ,

Я пробовал много способов, но не работает. У кого-то есть идеи?

Мой код, который я пробовал с библиотеками stb: https://codeload.github.com/nothings/stb/zip/master

// USAGE: gcc -std=c99 image.c -o image -lm
#include <stdio.h>
#include <math.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

const size_t NUM_PIXELS_TO_PRINT = 10U;

int main(void) {
    int width, height, comp;
    unsigned char *data = stbi_load("r3.jpg", &width, &height, &comp, 0);
    if (data) {
        printf("width = %d, height = %d, comp = %d (channels)\n", width, height, comp);
        for (size_t i = 0; i < NUM_PIXELS_TO_PRINT * comp; i++) {
            printf("%02x%s", data[i], ((i + 1) % comp) ? "" : "\n");
        }
        printf("\n");
    }
    return 0;
}

Ошибка, которую я получил при попытке с Джоном Смитом:

ImageProcess.c: In function ‘main’:
ImageProcess.c:14:5: warning: implicit declaration of function ‘bzero’ [-Wimplicit-function-declaration]
     bzero(data, fsize + 1);
     ^
ImageProcess.c:18:5: warning: implicit declaration of function ‘hexlifyn’ [-Wimplicit-function-declaration]
     char* yourDataStr = hexlifyn((char*)data, (uint)fsize);
     ^
ImageProcess.c:18:48: error: ‘uint’ undeclared (first use in this function)
     char* yourDataStr = hexlifyn((char*)data, (uint)fsize);
                                                ^
ImageProcess.c:18:48: note: each undeclared identifier is reported only once for each function it appears in
ImageProcess.c:18:53: error: expected ‘)’ before ‘fsize’
     char* yourDataStr = hexlifyn((char*)data, (uint)fsize);
                                                     ^
ImageProcess.c: At top level:
ImageProcess.c:21:28: error: unknown type name ‘uint’
 char *hexlifyn(char *bstr, uint str_len) {
                            ^

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Если ваша цель - получить содержимое файла в виде шестнадцатеричной строки, то это должно работать:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main() { 
    char* file_name = "/path/to/any.png";
    FILE *f = fopen(file_name, "rb");
    if (f==NULL) return;
    fseek(f, 0, SEEK_END);
    size_t fsize = ftell(f);
    fseek(f, 0, SEEK_SET);

    void*data = malloc(fsize + 1);
    bzero(data, fsize + 1);
    fread(data, 1, fsize, f);
    fclose(f);

    char* yourDataStr = hexlifyn((char*)data, (uint)fsize);
}

char *hexlifyn(char *bstr, uint str_len) {
    char *hstr=malloc((str_len*2)+1);
    bzero(hstr,(str_len*2)+1);
    char *phstr=hstr;
    for(int i=0; i<str_len;i++) {
        *phstr++ =v2a((bstr[i]>>4)&0x0F);
        *phstr++ =v2a((bstr[i])&0x0F);
    }
    *phstr++ ='\0';
    return hstr;
}

char v2a(int c) {
    const char hex[] = "0123456789abcdef";
    return hex[c];
}
1 голос
/ 31 марта 2020

Из вашего комментария я понимаю, что вы хотите извлечь двоичное содержимое файла (то есть изображение JPG) в виде шестнадцатеричной строки.

То, что вы ищете, называется " hex" свалка ». Существуют различные библиотеки и фрагменты, которые позволяют делать это с C.

Этот вопрос о стекопереработке решает именно эту проблему.

...