You can insert any data into an EXIF data block in a JPG. There is no size limit that I know of, you just split it into several EXIF data blocks if necessary.
libexif. C-, ( , JPG, EXIF-):
, JPG ( EXIF) - :
0xFF 0xD8
Exif :
0xFF 0xE0
Exif, :
0x00 0x10 //In this case it is 16 bytes (0x0010) long and it INCLUDES these two bytes of the header
Exif ( ). , 14 ( 14+ 2= 16bytes 0x0010, ):
0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x01 0x00 0x60 0x00 0x60 0x00 0x00
XML Exif , exif- ( ):
0xFF 0xE1
XML + 2 ( , 0xFFFE, EXIF):
0x07 0x7D //In this case it is 1917bytes long or 0x077D
xml JPG .
. ( , ):

JPG XML . , , Hex :
JPG XML EXIF
, JPG, .
++ (, , , !):
char yourdata[]="<xml> contents to </add>";
long yourdatalen = 0x18;
char * file;
long filelen=0;
std::ifstream infile;
infile.open("yourjpg.jpg",std::ios::binary| std::ios::in);
infile.seekg (0, ios::end);
filelen = infile.tellg();
infile.seekg (0, ios::beg);
file = new char [filelen];
infile.read(file,filelen);
infile.close();
long x=0;
if ((file[0]==0xFF) && (file[1]==0xD8)){
while ((file[x]!=0xFF) && (file[x+1]!=0xE1)) {
x++;
}
char * temp=file;
file = new char [filelen+yourdatalen+4];
memcpy(file,temp,x);
file[x+0]=0xFF;
file[x+1]=0xE1;
file[x+2]=int((yourdatalen+2)/0xFF);
file[x+3]=yourdatalen-int((yourdatalen+2)/0xFF);
memcpy(&file[x+4],yourdata,yourdatalen);
memcpy(&file[x+4+yourdatalen],temp[x],filelen-x);
delete [] temp;
std::ofstream ofile;
ofile.open("savejpg.jpg",std::ios::binary| std::ios::out);
ofile.write(file,yourdatalen+4+filelen);
ofile.close();
}
else {
}
delete [] file;
HxD, .