История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
тип такого, писал прям тут чисто как пример, само сообщение message не включено в запись.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])
{
const uint16_t start = 0xfeff;
char comment[] = "hello";
struct message
{
uint16_t comment_start_label;
uint16_t comment_size;
uint32_t comment_time;
};
/*+1 это учёт символа '\0' +2 это ты сказал*/
struct message msg = {start, strlen(comment) + 1 + 2, (uint32_t)time(NULL)};
FILE * file = fopen("./test.jpg", "wb");
fwrite(&msg, 1, sizeof(struct message), file);
fclose(file);
return 0;
}
я еще похоже лишнее обрезал перед записью в файл.
Я понятия не имею что там в заголовке джипега, но по хорошему надо весь заголовок так читать, менять и записывать обратно.
Или если в заголовке есть уже эти поля для комментария и место под него, то использовать fseek()
смещаешься на нужный байт , кастуешь в нужный тип, пишешь туда, смещаешься дальше куда надо и так далее.
Если просто взять и дописать в файл то что мы записываем по идее ничего работать не будет
Исправление LINUX-ORG-RU, :
тип такого, писал прям тут чисто как пример, само сообщение message не включено в запись.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])
{
const uint16_t comment_magic_number = 0xfeff;
char comment[] = "hello";
struct message
{
uint16_t comment_start_label;
uint16_t comment_size;
uint32_t comment_time;
};
/*+1 это учёт символа '\0' +2 это ты сказал*/
struct message msg = {comment_magic_number, strlen(comment) + 1 + 2, (uint32_t)time(NULL)};
FILE * file = fopen("./test.jpg", "wb");
fwrite(&msg, 1, sizeof(struct message), file);
fclose(file);
return 0;
}
я еще похоже лишнее обрезал перед записью в файл.
Я понятия не имею что там в заголовке джипега, но по хорошему надо весь заголовок так читать, менять и записывать обратно.
Или если в заголовке есть уже эти поля для комментария и место под него, то использовать fseek()
смещаешься на нужный байт , кастуешь в нужный тип, пишешь туда, смещаешься дальше куда надо и так далее.
Если просто взять и дописать в файл то что мы записываем по идее ничего работать не будет
Исходная версия LINUX-ORG-RU, :
тип такого
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])
{
const uint16_t comment_magic_number = 0xfeff;
char comment[] = "hello";
struct message
{
uint16_t comment_start_label;
uint16_t comment_size;
uint32_t comment_time;
};
/*+1 это учёт символа '\0' +2 это ты сказал*/
struct message msg = {comment_magic_number, strlen(comment) + 1 + 2, (uint32_t)time(NULL)};
FILE * file = fopen("./test.jpg", "wb");
fwrite(&msg, 1, sizeof(struct message), file);
fclose(file);
return 0;
}
я еще похоже лишнее обрезал перед записью в файл.
Я понятия не имею что там в заголовке джипега, но по хорошему надо весь заголовок так читать, менять и записывать обратно.
Или если в заголовке есть уже эти поля для комментария и место под него, то использовать fseek()
смещаешься на нужный байт , кастуешь в нужный тип, пишешь туда, смещаешься дальше куда надо и так далее.
Если просто взять и дописать в файл то что мы записываем по идее ничего работать не будет