Как выводить целые числа внутри цикла for в виде шестнадцатеричных значений в файл

#c #for-loop #image-processing #hex #fwrite

#c #цикл for #обработка изображений #шестнадцатеричное #fwrite

Вопрос:

Я пытаюсь создать изображение .pam с помощью некоторого c-кода, но функция fwrite записывает в файл только аналог ASCII, а не шестнадцатеричные значения.

Заголовок файла должен быть ASCII, а фактические данные изображения должны быть просто шестнадцатеричными значениями для rgb и alpha.

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

int main() {

    FILE *out;

    out = fopen("C:/Users/entin/Desktop/write.pam", "wb ");

    if (out == NULL) {
        printf("Unable to access file.n");
    } else {

        //everything concerning the head

        //buffer the head to not get an overflow
        unsigned char headbuf[100];
        sprintf(headbuf, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");

        //reduce head to nessesary length so it dosent output useless NULL's
        int len = strlen(headbuf);
        unsigned char head[len];
        sprintf(head, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");

        //write head to file
        fwrite(head, sizeof (head), 1, out);


        //initiating pixel values
        unsigned char buf[8];
        int r = 0; //AA
        int g = 0; //BB
        int b = 0; //CC
        int a = 255; //DD

        //for now just change the red and green values
        for (r = 0; r <= 255; r  ) {
            for (g = 0; g <= 255; g  ) {

                //coppy pixel data to buffer
                sprintf(buf, "XXXX", r, g, b, a);

                //write buffer to head
                fwrite(buf, sizeof (buf), 1, out);
            }
        }

    }
    fclose(out);
    printf("fin");
    getchar();
    return (EXIT_SUCCESS);
}
  

Он выводит заголовок так, как я хочу, но значения пикселей также записываются в их значениях ASCII

Он выводит ENDHDR nAABBCCDD

как. 45 4E 44 48 44 52 0A 41 41 42 42 43 43 44 44

это должно выводиться следующим образом: 45 4E 44 48 44 52 0A AA BB CC DD

Комментарии:

1. Вы правильно написали код, который у меня есть 00FFCC0001FFCC0002FFCC0003FFCC0 … Чего вы ожидаете от первых байтов?

2. sprintf(buf, "XXXX", r, g, b, a); Это форматирует ваши байтовые значения в виде шестнадцатеричных чисел. Если вам нужны двоичные данные вместо шестнадцатеричного представления, запишите значение напрямую.

3. Если вам нужны пробелы между числами … гм … добавьте пробелы в строку вашего формата. И почему бы просто не использовать fprintf() вместо этого sprintf() / fwrite() thing (Которая имеет неопределенное поведение, потому что sprintf() записывает 9 элементов в 8-элементный массив символов…

4. unsigned char head[len]; Это не требуется. Если у вас есть длина вашего текста, вы можете использовать его для записи headbuffer . Нет необходимости копировать это снова. Вам не хватает байта для NUL-терминатора enyway, а второй sprintf будет записывать за пределы. А также использование strcpy было бы дешевле, чем выполнять форматирование через sprintf второй раз.

Ответ №1:

Я исправил свой код и просто записал значения как их аналог ASCII.

Вот исправленный код

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

int main() {

    FILE *out;

    out = fopen("C:/Users/entin/Desktop/write.pam", "wb ");

    if (out == NULL) {
        printf("Unable to access file.n");
    } else {

        //head
        fprintf(out, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");

        //initiating pixel values
        int r = 0; //red
        int g = 0; //green
        int b = 255; //blue
        int a = 255; //alpha

        //for now just change the red and green values
        for (r = 0; r <= 255; r  ) {
            for (g = 0; g <= 255; g  ) {

                //call the numbers as theirr ASCII counterpart and print them
                fprintf(out, "%c%c%c%c", r, g, b, a);

            }
        }

    }
    fclose(out);
    printf("fin");
    getchar();
    return (EXIT_SUCCESS);
}
  

Вот первый результат

красный /зеленый вариант, синий / альфа fix255

Комментарии:

1. да, я знаю, нужно увеличить высоту и ширину до 256