It would be great if the JSON output format supported binary output via -b using Base64 like the XML format does. Thanks for your consideration.
In XML this is possible because XML supports attributes that allow the encoding to be specified.
As far as I know, this is not possible with JSON, so how would the base64 encoding be indicated?
- Phil
I don't think that Base64 needs to be declared explicitly in the output; it would still be useful even if the caller needs to know in advance. That is, much like the caller has to know that "ImageSize" will be in the format "(width)x(height)" for it to be useful, the caller has to know that "ThumbnailImage" will be in Base64 in order to interpret it properly. Since the caller has to request it explicitly via "-b" anyway, I can't think of any disadvantage in supporting it, even if it is not self-describing like the XML.
Thanks again for your consideration!
I agree that this may make some sense for ThumbnailImage, but there are many other tags which may contain binary data and for which Base64 encoding may not be immediately obvious.
I was under the impression that JSON strings are constrained to valid UTF-8 characters, but I re-read the specification and it seems that "\u0000" may be a valid way to represent a zero byte (even though a zero byte is not valid UTF-8). Perhaps your goal could be accomplished via \u escape sequences? I checked, and this is valid JSON according to the JSON validator (http://jsonlint.com). What do you think? The disadvantage of this is that a single byte would grow into 6 bytes, resulting in up to a 600% size expansion factor for binary data.
- Phil
I have run a couple of tests. Escaping bytes 0x80-0xff with "\u" is expensive in terms of file size, while values in this range can be expressed by 2 bytes in UTF-8. So if I escape control codes (<0x20), and encode bytes 0x80-0xff in UTF-8, the expansion factor for my test ThumbnailImage is about 2x (while if I escape 0x80-0xff too, the factor is about 4x).
I think this is valid JSON, but the question is: Can you convert it back to a valid JPEG image?:
[{
"SourceFile": "../pics/a.jpg",
"ThumbnailImage": "ÿØÿÛ\u0000\u0000\u0003\u0002\u0002\u0002\u0002\u0003\u0003\u0002\u0003\u0003\u0005\u0004\u0003\u0003\u0003\u0005\u0004\u0004\u0005\u0005\u0008\n\u000B\u0008\u0006\u0007\u0007\t\u000E\u000C\n\u000B\n\u000B\u000B\u000C\r\r\u0011\r\u000C\u000F\u0011\u0012\u0011\u000F\u0015\u000F\u000B\u000C\u0014\u0014\u0014\u0013\u0015\u0017\u0015\u000F\u0011\u0017\u0013\u0014\u0013\u0013\u0001\u0003\u0003\u0003\u0005\u0004\u0005\t\u0005\u0005\t\u0013\r\u000B\r\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013\u0013ÿÀ\u0000\u0011\u0008\u0000 \u0000x\u0003\u0001\u0012\u0000\u0002\u0011\u0001\u0003\u0011\u0001ÿÄ\u0001¢\u0000\u0000\u0001\u0005\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\t\n\u000B\u0010\u0000\u0002\u0001\u0003\u0003\u0002\u0004\u0003\u0005\u0005\u0004\u0004\u0000\u0000\u0001}\u0001\u0002\u0003\u0000\u0004\u0011\u0005\u0012!1A\u0006\u0013Qa\u0007\"q\u00142¡\u0008#B±Á\u0015RÑð$3br\t\n\u0016\u0017\u0018\u0019\u001A%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\u0085¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùú\u0001\u0000\u0003\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\t\n\u000B\u0011\u0000\u0002\u0001\u0002\u0004\u0004\u0003\u0004\u0007\u0005\u0004\u0004\u0000\u0001\u0002w\u0000\u0001\u0002\u0003\u0011\u0004\u0005!1\u0006\u0012AQ\u0007aq\u0013\"2\u0008\u0014B¡±Á\t#3Rð\u0015brÑ\n\u0016$4á%ñ\u0017\u0018\u0019\u001A&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\u0085¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ\u0000\u000C\u0003\u0001\u0000\u0002\u0011\u0003\u0011\u0000?\u0000üèø\u0010gt4=þ×ÿ\u0000¤ïR|\u0000\u001B¼{ úüÿ\u0000Òy(\u0014¶>ø¯ýo Þ¥ñO1á\"\u0015?x·µyÇí\u000B xûJ=o\u000EúbÅ´ã¢\u001FZ7±\u0007\u0085Ê\u0085|°y+(LN\u0018\u001DÁG½fîR;O\u0085Zoâ>ëRÚ-Ãàè\u000Fjç#ÿ\u0000[¼ÖÞ×\u00172\u0015D1MMÚz\u0014Ñ÷§Ùæ%\u0085DÊ\nèEsÿ\u0000\tt-gCðí¨ÄÝ(É\u0004ä¨=«¡;£3ªHrjâ&\u000Eh\u0002\u0006\u0000\u0005Xd$Ð\u0005Q\u000F\u0019Å^òÎ(\u0002\u0008\"Ï\u0015vÖ,@È<jÑò\u000F¥\u0000Ì[û\u0018n`\tP4n¤0=ÅSø>©§è\u001AÞ\u0085®£·buéEúø×ã6\u0085¦øoÄ÷\u0016\u001Aq\u0002ÞdÞè½\u0014µÍk·7·òË{;´\r#\u0019Ëu\u0006±º*ìÆ·xâó\u0014¦IáO¥X¶OÙ0&i\nþìÐÔ)¾Æ¼¹õ\u0017ì×¢èGÃÆú ¨<Ì&þòúWþÎþ*\u0011ÛI`$þÏ\u000C~Ó×n=êéÉíb%\u001Bu<×âJìñwSÓÄzÿ\u0000ÈÍOø 1ã/\u0016O\u0013j_ú=«q£ ý\u0000o>\u001F\u0007¡ûgþIU>\u0007j\u0011i^6ѵ\t\u000E\u0012\u0015¼$ýmÜP'±ô߯O\u0013è\u001A.y¦Ü²½ÕÔ\u0005b¾Ozùßã'×]×N§\u001C»ÑSfßJÎR!\u000BþèÆ\u0003|ÈIúUY\u000B+\t\u0014ýãPÓ\u001A;ÿ\u0000>)µÐ¼Sc®ê4a¹#§\u0018\u0006«ø\u001BÁ^ øª-)HmÕMÔøâ5ì>§µC&¬§f}µ¥øDÕ-Òþ\u000Bh\u001Cd6k3Â_\u000Eí¼)ei¥Å\u0018\u0011uuÞrÌ\t#'êA¬§¶È\\§Ege|í\u000C2nd\u001B\u0007íTonäÓ5\u000BKh-K\u0019.\u0007Ê3ó~\u001D>´¨ã9®ç¢)ÁÝØYa®gH2ä\u0001p:×½Äÿ\u0000\u0011|k\rìÍ&áé>̰3a'¹_¼Î=\u0010ôãÓ\u0015o\u0018tâö=ªÇÅZ>¦weºâͳÓî;¯r?\u000F¦iú~\u0011¥¨\u0011Ä#\u0001\u0018É|ô\u001Cu®Yc§}\u000BTÍí4Ãp\u000BFC\u0000qÅeéóé\rk\tØ\u0011\u0018Ý\u000F=2{~£´s\u0008ßT/dÍJêÓI·{ë+\n2) \u0013˰P0=I®Jöâ/\u001Ck=åÌZ%¬i,À©Ì\u0003\u0007åW8\u001D2AààUÖÆÆ*Ñwa\u001AO©Ñê\u0017v&ÁoÝo?«Á9ó\u0018*{\u0005Esá«{{\r\u000EÓPSa$âçÊó¾<²ª±é¹ðqùw¨9(ù¥Cä¿ÿ\u0000\t<DÚÍ÷ô½0Ç¢\u001D%õ)¦b\u0015\u0002!Áêz0:úã\u0007n<YðÛÄT2,RÃáXõ\u0002ÏÀ\u0002ÕÄ̹ãÛ·êh¥u5·KTÔ^§ç\u0085¬Ë\nM\t\u0013&0Ǩ«\u0016¶«\rÄMj®ò\u0000\u0015Îr=«w7Ø¥\u0005Üúÿ\u0000öb¹ðä\u0016ÒÕj\t#\u001Bþ\"}kË?eï\u0007ø¦ï^Ä\u0006K\"VìþÕt¤ö±\u0012]O\u001Fø¦1ãO\u0017O\u0014jú=©~+\u000CxÛÆ#ÓÅ:§þjÜhç´ûɬ'K¨$Ep\u000FûÊGõ©4>]Vò\r>!'}«ùRÂ{\u000C-5Ü1Ë1ïZzæwá̸߲`3Ï¥fA3\u0005*ªs³½:H\u000C Ið=è\u0003ëßö±xcÃ\u001A\u0008\u0085#7\u001AÕ·Û§\\\u0014ã\u00198 \u000EG\u0015ÐéÓ~\u0013A¬\\Û\u001F±èÞ\u001CÓæºÀÁY#,y=c´{WZNRv5]NÚÁu+Ân¦Ô#\u000C÷P\u0001ÀÏ\u0018l×/ðSâ\u001EñKL¸»Ò;[ë%§ÈùKE\u001A¸\u000B~b8à\u000Ey¬*)EêTlÎÞÚÞ{èó%Ìð´c·ÐW|+ý¢¹_x^ït\u0016³oþÊU$\u0017?u黨üy¨\u0019¥vçô)ü>²wñ¿¥ìÝzñÊö$LØ-ß\u000B=ϵmü/ÓÒæþËÅ3Ü\u0015_\u0015ÛIyæv[¼äú\u0002@9ìjìú\u0006Î\u0007¶Å Ð+ym8þ\u0011ïøVNº¥ýÅÌ~{A¾òæ00p¨¨Lvù=ÿ\u0000c:¶Õ#HÂêÆm¬ï/¡)òF$ó\u0015G\u0018Áür*ΦÜYkFñæy\u0003E%±\u0019\u0003f\u0018ýÈ\u001FþªÆS{ص\u0013WYðõ¯y\u001AÀL2G\t¥P8=\u0000#Ï_¶t Ó\u0019îL¾`%QH\u0018\u001CuýkÐÀa[ÊkC:ÓåÑ\u001Ci×¾\nͪÛÄË#¯\u0008C\"N{\u0016\u0018õÆqZÖR=£®ê\u0008\u0003)ÕbÀ?x}|¤öù¿Îk:T'(ôÛïÔi¹¤úWíYáX¬¾\u000F\u0012Eu2Ï6c\u0014È\u000FÉ,lÎ\t<ÿ\u0000x\u000EÃôÏÚÖhÓà}Æ\u0008Y#¿±m¹î³n<{\u0003]8tbÒÔÉë&Ðüëå [O)HF=*{=\\Ciyhm#Ý*(Í\u0019S©÷é]jr¶¨n\u0010èÏ´?f/\u0016økQð½-\u0013Q²R&»{×~Ê\u000C|@ú>>tôFT\u001FóÓ?Òµ¥)=,g$Ñ\u000BñgþG\u0019\u000FúõOý(z>-ÿ\u0000Èóã?û\u001B5_ý(zÜ\u000B\u0005c¶Æº\u0012\\cÉ3Ë»?õɱXÞ\u0007\u0017Ç[²6`\u0085ó]1þÌlOéCv\u0013=7öµÓÿ\u0000á\"·µ´Æão¹ñ\\ÏÄ]fM\\ÛÞ\\FVú\u0011±î+)nCÜÁð\u001E5\u0011èúHÇæß \u000F\u0008ÁÏ\u0019ã<T~\u000C½¸Ó¼C¢_[Ý¥¨Dâ@\nÄ\u001Cíf ö\u0000Ϊn\u000EÃ×SëOVÞ*_:£#5Ρi&¦>c\u000C\u0000±P=\u000Bì|vÛÇ|÷>3ñÿ\u0000¾\u001FÉaáýe+m~T0g¢¥¹PÙ8À8l\u000Cy¯\u0012iÁ¶Î¹Æ2Ððÿ\u0000Ø«UÓ!ñ%×õ'\"ÎõíÚ\\\u0004lJHöFF+Þ4o\u001E\u0002:´_\u0010ü3¨'yk\"\\Dnå@\u0004©Á\u0000ä\u001Fºªâ#;;jb¡n§Ï¿\u0002üAàO\u001A§çSn4UîìåÆ\u0014Ç¿r\u0011ÃÞ¾ñ×¼=ãcÃÞ\u0016ÌMâ\rØÌº¬Ñsæ\"ìX\u001AAýâ\u001B¹9#5¢Ä¨ÇkÉvs^\u0004ø-Ã[M6úX«k}qxBÁç¹}¬\u0008ã\u000CúÕínúøß-mÓËÝ\u0014xãn0\u001B·qÿ\u0000ë®\n\u0017Tm\u0014ú\u001D®á\u001F\u0015Í¥.°í\u0002¨*Ï2\u0003¸çåÝp\u000Ex8ªö\u001Aþ§\u000EúKÍu\u0012Ëà\u0015Øä\u0010W<g×\u001Dz×74-®æÖ¡åÁ\u0004öV0³ÂÛK\u001A¶r\u001Bs©b{dIé©èÖP\u0006ÒbÁÌêW¨Ç|ÿ\u0000/¥mNQms-\u0008hÖÕîßE¶ÂÊ1-ýË\u000B{8ØÏväp:±Èúó[þ\rÓ´Y ñVµ\u0010Ôn9c³_¹ØÜ@ëÈägëÒ½9ã\u0015iè¿T:³{Tðm}®àî5þ¥3õ\u00138à}yÏN8ìqZ¾ ðÕ\u0012sâ\r@Eg4¯3@\u0000Ý+\u0013F:väôìk\"|ÒM²äÞ×8)|s'Ä?\u0003xÄVÖ?Øíob±tÜI\u001C|IãªqNzV§<_á]3Âú¾\u0014eg¦ÛÏ\u000C×\u0011Â\u001FÊ\u001B@'Ë?{\u0019\u0007\u0004\u0001É\u0015jZ¦ÞE¸ûºv÷PÙϦÔÃ4ìÄr\u0008ô5j\rW¶±¿ÓáÇØµ\t\u0010LJ\u000C¹}qø\u001Aõo+jÒsìßÙâGõï\u000FXøF6\u0011êZt\u001BZ?ï\u0001ÜW;û.|\u0019Fßâ-ä¤Kyn~Ï\u0010ìÜÖÔ\\®ÆSQèϾ.ÈõãOû\u001B5_ý(z>.ÿ\u0000ÈõãOû\u001Bu_ý(zÜ\u0011oàµÝ¥´{«¬y\n.ÃçÞ\u0007\u0003õ®_Aá¿¶N\u00181\u0019úIì&z?Æ\rOM¿Õ\u0085\u0085¤j*of\u001DÍKªøkL¾Ó&Õd\u0013E\u0016A5D3ËâHîn ·%\u001AeBW¨\u0004ö÷ükÖ¼\tû4øÇâ/\"ñæyk$K;¬öä*\u0004lgÓ¨ëYʤc»\u0004®{_í\u0007ðóÅÿ\u0000\u0011|5àÛÝ:Üj\u001A\nFó¨ò¤¨\u000B3)À\u0004°\u0004ãïü;7Ä\r'@·´ÊÝ.¬í\u0012\u0008RIye\u0000\tÀoJñUiÓkS¯-Y=ðÃÂ\u001F´\u0007ÃÂAbãO$\u0019`y\u0015\u000Fï.\tÁúb½\u000FXý¦|{àhNâ?\u000CI\u0015\u0085Â\u0018VH20\u001Cc8Çê\rmyUZÅ_úó3vÌ»û\u001Aø3Å_\u0014eøñ\t#FûYXf\u0012H 6'nâ8\u001E`éé^qð\u0013ãí§%¹ðkï\u001A.¥¬<ÐH§cm\u0005ebU½9ÇçÀ«i(®dÉë£>´°¶êKÙàIãY6©\\\u001DȲ0àûã?hé\u0016RÆÔÅÀ\u0004óÁ\u001C\u0000\u0007=+Ϫﱽ7b\u000Bí\"ÂâK{u\u001F>Ö<\u0008<gùâº?OÒßPH¤\u0004QܲHùàóó\u001Cú\u000E1ïJ4äÝÜÖèóyWSðÖ¨zYeí,±õ(\u001Bo\u001EÀqø×gâÍ\u001EÏSøá½\u0003JÕ\u0011\"}\t¥à)mW*PÝp\u000F\u001DýkHÑj|Psº»0 ñðÒÐXر\u0010ÜÈÅ×\u001B9Ë`vÇ\u001FI¦¿t©izxáÔ$\u0008do~\u0000l¤ST§=cv¹Üç5\u0013èV6wZ,òê(¼,èÛÉ=<\u000FÀýk_R¿Õ¢\u0016÷Z\u0014\u001Cè¸\nI\u000CË\u000FQü\u001AêUêQWö*f÷<G[ð_SOø\u0085ã\u001D%ã»»Ö4¤³;â°Ç\u0014m\u0013\u001BQ!\nÍÐ.q\u0007^«ûPxïA»ð^£f·QÆ÷©$vq·Ì(pÁFÒ2¹É\u001C}A¬èÕJëaÎ1ì|A\u001E®-géÑÝù\u000F \u001F \u0019Û»¦qïL¶¿××Mm=n\u001CiÍt%h³ò1ã×\u0015éÞV%(u>Êýþ0[øÂßÀW1¾ÓmvÝ\u0016µ?f¯ºgôO\u0018Í5]RÐ9'¢+v\u0015\u001E~»\u0019Oþéñ_Åÿ\u0000ù\u001F<mÿ\u0000cn«ÿ\u0000¥\u000FKñþGÏ\u001BØÝ«éC×@\u001C¼\u000C*2bu\u0014¥°¥±¸þ\"Ô/#[)e>OqëXõ\u0007Ù_±÷|'¦è\u001A\u0085®£\u0002³ZFdºòÛ,VGP\u0014\u001Cä\u001EHî¸çÓÉ?eûvþÙ»ºC%ÐÊû6\u000E\u0008(Ä1Ç^FÑîs^f>*-LÞoCïý\u000Fá¿|Ym«kzEͨ}.ÐÜÉ\u001B\u001C³.pJ®z¯Zâ~\u001Ch×z\ríÏõ\u0085ÞlżxÙ\u001A1ËgÕÇ>\u0000ÉÏ=5\tÞè$å\u001E¦Þ\u0010ðþ\u001Důký¡\u0004r\u0010þ`\u0004\u001F0\u0000Xµô»t¾»Ýòù7°'{úë+%¨)3À~\u000Fðuä\u001AE¬k¥ÜC¾\u0018Ùså˼:ýz÷®³Æ\"ÞHì.Ô\u001Déz¨JqÃu?¥e6Û¹¢Ñ\u001A\u0016>\nÓïÒù<Ò˹NíÇëÇ\u001FZßµºGòÙ$u \u000F¸q*å\u0018¢\u0013l©iág\u0017íC/M»²}:\nÚò(Ü»É#($á¤ÀüqIB\u000F©MÈç´_\tëº\u0016\u001Fígqsgn¶ñÊ@c\u001AîܸÝïÓ#ꢹFѬØ\t®x.\u0006\u0004JO;3Ü÷'Ó dUÆc¬[¸:ü[\u001Eiá/\u0016¥¾±×<ØoäÔ$FhÎß\u000Eã=O9é]ö½£Úê÷×\u001A¼vñ\u0085±0i©\u0018Þ\u0012<eû\u001Cíäã¾kªiaýůùÒ©®Ç1â{ø.ím~É2ºÍx©½\u00088ùI\u001F®*¥ï\u0085ã¹·iÒ\u0003o6ö\u0008~éSÓê)ÖÅ:Ôì\u0018r=Oÿ\u0000h/\u0012Ïý¤x\u001Dôöfåõ\u0019u\u0017R\u0003Ë>æhãí¿æäò\u0007§;¿´§þ-jÖpø¹>ÙàÝ>\u0007KVµRE\u0018«4÷b¿xñÛï\t\u0017g+ê÷\u001C¥\u001Ek5¡ó´V\u0017¿fyÇü{£yã?JbXÝý;\u0008¤nÜóõÅuZVÔ®htGزwÅÍOÅ\u0011\u001F\u0002^ÄXé¶¡tv5ê?³ÿ\u0000Ã/\rx'Ã\u001AmíJ׺\u0085Mq?ñ1agÐWE%+jsÉŽ\u000FÏ#\u001E=ñ¸ÿ\u0000©¿Vÿ\u0000Ò§|e\u0018ñÿ\u0000G§5ý)zÜg#\u001A`\u0007½_ðü1Ïz±¿Ýû=Áü¢b*e°¥±\u0004E\u0010Ý0j3p\u0005A½à_\u001FøáÞª!ÒfÙ8C\u001CßvD'%XW?.>^9Ç4§\u00055i »[\u001Fpü9øý¥xËM7WRù7¨¾ô\u001BFN\u000Fç_ ü>Õg°Õ µB6]M\u001A¶GB\u000F\u0007×\u001E¼ò+̯PNPz\u001BFwÜý.ø{=ÕÎ=ÊZÈÏ«È\u0004Q±ò\u00021\u000EýkËt\u001F:\u0012\u00185XÞ\u001F²C\u0016e\\ò\u0013\u001Cà\u001E>\u0007\u0015Á\t[Ý5¾§¯eéi!9ýÅíÓ\u0004ÿ\u0000Nk\u001BJñzêþmø!RAç\u0000½\u0006qïctâ²æW³Ciô:ë=\u000EÕ!g[\u0001\u000E\u0017\u0001²0X(ÁýjîmäÈ+pÿ\u0000²Mm\u001A\\Ö%Í«þ\u0016ðÎ>¥kqqmçYC«Ék*±Æ|ȳ\u0016yêÄ\u001EÜbAªN!×4;R+×±\u0003\u0019/\u001E<²\u000FQó\u0003\u0011Ô×M:QnÛ?ÌM´ÅlZF¥\u0005å¿Ë\u001D¥ð#-\u001B\u001F8ã uâ§øg\u0004Oe©A*ýT²K¶\u001CãdlöëX×\\ºÛ¡p\\ÛU·u\r-mÖånîâ%\u001C\u0018öÌ\u0017à~ëO\u0011ÚiM\u0005à·C2\u001F-92m=\u0000\u001E¸Æ3E:©·~¡(´u\u0013[MÇT\"5\u0019¿ØÞàýNk7Á?\u0014ôo\u0010¦«¦0µõÆ$l+\r¹\u0007Ô\u000Cò8ÉÇZÚ2¦Û³!ÆIjeøoÅ\u001FËPðRÆ÷\u00167÷0ÝÁÁ ;\u0012¡÷H?ΰüKðí´\u000F\u0010Mñ#IºßÙ¤:\u000B¶×Qê2sÞ¢QpÕ\u0014ççÿ\u0000Ä\rZèúß$µ\u0008,¼Myi\r°?2¨¶=\u0000â£ø§Gkºôú~}ï¯VKqê¦V;°{W¡OàM²Cé_ØËâ/5ô½ð½Øi´Ý>ÝL\u0012üû¹¯nø7£xGÃ>\u0015Òmth£\u0011=o$ÈÄrI®ºqkvs¹'²?8þ2óãÿ\u0000\u001Cú5ý)z>20o\u001FøåCã\r\\ÿ\u0000äËÖÅ#ÓÝ£08>\\?U5\u0004mµ³ìL¶\u0014¶\u001E4dyÁ¦\u0003ÍA\u0016-éz}Æ«uo§Âd÷3,q®z³\u001E\u0007ãZ\u001E\u0012ÑõÝJö+.2f±9üÌ\u001CFÀås{Ë\r#×þ\r~Ï-Ô<G\u0015ΧÉken\u000B«\u00120X`\u001F^¿Ïµzæñ/X²xe{\u0019<à½@êG#c\u0019çñk×Ur5eätÆ1º6>>ëº\u001F4I4I\u000CRÜ^ÅöXÑ~ñ\u001DÛð\u0007ëñ\u000F/|u«K¬Ý\\\u0085TGk\u0013+\u0000ÔöêOZXL*o«ù\u0005Iôè_\u0008~6øb0<3ªÿ\u0000¢\u0004c±7\u0000\u000Esèyç?\u0085y¯Ã\u0016>#îÇ_ki¡\u001A';dF\u0007=GPG¯zëÄÆ~fQæ>ç¹ÛKÓ?µÒê9¡HçxÚp çX~xúW9áý#J´ð¶©¤Þê^liàZÉ*9È,9##~çÊ/É-â®ìÏ.ñgíyá\u000CÉ\rÅ?n»Jy\u0010rª7VrG-Ø\u0000kæ-GáV»\u000E§w\u0002É\u0017Ù¢¸bf$\u0007§¥zt¨SK÷0嵪ôÿ\u0000Û\u001BVø\u0019xrÞÊ\u0018\u0014£3\u0016$å$\u0002IçµyïìÍ}¦ü.Õ5\u001B½nÒ\u001B¸ç³X¢m»±óÃiÇÞ\u001DNUnUk+)÷>¯ý«ã\u001FÄ^ Ö-V-\rîÕl%\u0017.c\u0019~s\u0010\u001Cw=O5Â|Cý¡mõ\rÉà\nÝln¶CpÑ VhFw&Aîq:dw®eMMê·û[ihp\u001F\u0017~#Í{«-·eû-²êV¨.\u0019eB\u0003àÿ\u0000tójãô½2\u001F\u001Ck\u0016^\u0011³½ÞîêP\u000C³î\t\nÿ\u0000y:\u000Fl×W±\u0085:N\u0017ßó3ærÏ®<\u001Dâ\u000BËÝ6;{öI\n&Ôu\u001DN?ôýkÔÖãÀ>\u001BÔõS©Ãvt½.âå¼\u001F¼\u0010!b@ÉäÐgë^e7;ØÚJ;\u000Büx³ð¾¡â\u000F\u0012øÇTAxþ'Ìéê*±.ÖvqË\u000FNõå÷7òÞ4ÈKÝ\\\\4²JÇf99úöiÒQW1æÔ÷oÙÛã\u000E»á×¹Ñ.äy¬0aR~á®wá¦.²j·#q1±~µ´43z³Ì>\"ßiø³Äú1ö¿\u0010ê\u0013ãýùÕO\u0017\u001DÚî´qê×Gÿ\u0000\"\u001AÙ\u0016¸ñ¸g§4G÷\u0085)l'°òSÄo!TQb\u0000\u001E¤ÖDÓû*øKÐuÝVÆþH¢öÂ9\u0011æ`«¾'À\u001C÷!ü+èOÙïà®ð×LT½eñ\u0005í¿úSDjüùkÛ\u0003\u0003æ¸qN5\u0017)QÑÜît½oÃ\u0017\u001Ed¿mµü¼½1n\nò[U\u001A\u0085ÏR£^Sj:Xé·6·+j7ºV\u0016Eò\u0008¨@0yÆ}úR<\u001BlqÊ×å\u0014t\u0011§mÉt«Ë[Ç[ÛdFþI\u0018\u000E\u0003\u0011Æxã8?\\´Ò¢!%P>ogJ¨TÙ\\\u001A4~Ý\u001EV'LcH\u001E¸«vÚu¢íìËÂ\u000CWde.¨Åµ}\u0005µ±Ñ$IÚÂ\u0012ò\u0010\u0019¶\u0002N8ÏJ¶|\u00087G\u001EÂrxãüæ´S]Q/RíáF9±´>ö÷\u0016ß¼i\u0014\u0003ü$Õª¶è+\u001E¡ø;áΣ\u0008µ¹ðÕÛ²Ð&sé+ÍâõÈ1ßΤ Æ\u001Dº~tÞ!urù´\u000B¾\u001FÚ\u0010Ö\u001E\u001C²Mìså¼~B¼³ÏÖ\\mmRç8vàgëS,D_Ù\u001Aë7\u001E\u0018øw¥YOsè6sZI\u0019UW·R[=²W¡¯%Ôµzê/²Ï©Ü<[\u0000Ú\\àr*]xôAfÎ\u001FW\u001A\u0004¿\u0010|XÚ-vZd:ýÄ6öñ\u000C*\u0008iÀ÷ Æ»OÚsá$Þ\u000EÕÅöj_KÖnæ'¬W\u000EI`}¨÷ÈôÏ]*±ÐObçµk\u001BÛ(\u0015NY#\u0000ãµq^\u0000F\u0085L nÈïÚ·LÏ<XA×5:\u001DVë\u001F÷ðÓ<JÛµ}U½u+ÿ\u0000ÕlZØ£n»¤Uõ4¶P\u000E¼ÿ\u0000*%°=²¯\u0003\u000EH¤¸uÆÞõ'¤xoÆsßÄ!iÞ9QFà\u0018ãNkð´$²;6\t\u0001TW=H%¨Ñèo©_³\u0012·scýöïøÕ\u000B)Rf0YA\\Î7-JÆÕµt Ç}r¹;¸ò5yw\u0014Ga8\u0002fW5Î\u001F\u0012kÜ\u0006Õosá¸É«´½·vùOAúÓQhÑØÇâ=}FFµ¨ü]Î?özÀY>_3?(ëíUa\u001D|^3ñTj\u0000ñ\u0016ÀÇü~ÜñÊä£Õm\u0017;\u0000U{6+ü@ñýÏ\u0010ê¤ûÝÎÖ\u0005\u0085åÓª£\u0006\u0000\u0002Ô{0¹ÕÛ|Nñݳ\u0007\u001Aíé#\u001EWoæM6ÒÒÞ\u001BAªM\u001E '\u0001qG#\u0015Ñyþ/xýÈqÜ.\u0017o\u0007¯× Öoö\u000Cm9\u0018íùÐé4\u001CÈÔã\u001FÄ\u0085\u0008WX)ÎJFsù©«SøÂ2i3ZÜÙt^$Oÿ\u0000UO³\u001DÏ-ø£ñÅ>,°\u000B^êFæÞIciWd`\u0002#Pszó-Q kû§V+\u0011¹w\\gè§IGQ6z\u0007\u0085®\u0004Vê±°Î9®gH¸Ô\u0019À·ÿ\u0000QîqÇÖµ$å|@ÅõMIS9?÷Ù¨õsûÓÜÝËÿ\u0000¡\u001AÙlZØÿÙ"
}]
If this works, then the only problem I can see is that binary values which are valid UTF-8 will be double-UTF-8 encoded via this process. I don't see any way around this, but I'm not sure how often this would happen.
- Phil
Base64 is the de facto standard for encoding binary in JSON and would certainly be my preference over using U+0000...U+00FF, especially in light of the difficulties you mention. It doesn't seem intuitively preferable to Base64; either way, the client needs to know that the value is a binary blob and not a normal Unicode string.
Perhaps an encoding prefix would be a good compromise? e.g. "ThumbnailImage":"base64:/9j/7QAMQWRvYmVfQ00AA..."
Quote from: ejball on February 03, 2014, 12:13:55 PM
Perhaps an encoding prefix would be a good compromise? e.g. "ThumbnailImage":"base64:/9j/7QAMQWRvYmVfQ00AA..."
This sounds reasonable. I'll think about this.
- Phil
OK. I think this is do-able.
The only complication is when reading back a JSON database with -json=infile.json
When reading back a file like this, the value will be converted back from base64 if it starts with the string "base64:". The problem is that this may produce funny results if any value starts with this string by chance. But I think this is a reasonably remote possibility, so maybe worth the risk.
Unless you hear back from me, this will be implemented in ExifTool 9.50
- Phil
Thanks, Phil! Looking forward to it!
Quote from: ejball on February 08, 2014, 09:09:18 AM
Thanks, Phil! Looking forward to it!
Version 9.50 was released about an hour before you posted this. :)
- Phil
Awesome! Successfully extracted and decoded "PhotoshopThumbnail". Thanks again!