<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8031017882989122084</id><updated>2011-07-07T18:18:06.086-07:00</updated><title type='text'>GSoC 2010</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-4041248015637500940</id><published>2010-08-08T11:00:00.001-07:00</published><updated>2010-08-08T11:07:19.964-07:00</updated><title type='text'>Похолодало</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qffKi9eNTwo/TF7yTqNDZ7I/AAAAAAAAAB8/6IxXjp2G4D4/s1600/08082010008.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_qffKi9eNTwo/TF7yTqNDZ7I/AAAAAAAAAB8/6IxXjp2G4D4/s320/08082010008.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503102214253799346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qffKi9eNTwo/TF7yPo8_oKI/AAAAAAAAAB0/bIe6sm2cwXM/s1600/08082010009.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_qffKi9eNTwo/TF7yPo8_oKI/AAAAAAAAAB0/bIe6sm2cwXM/s320/08082010009.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5503102145198530722" /&gt;&lt;/a&gt;&lt;br /&gt;Сегодня был один из самых прохладных дней за все лето. Днем мой градусник показывал всего +45 на солнце (обычно все +50), а вечером температура упала до +33. На улице можно было дышать и даже гулять.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-4041248015637500940?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/4041248015637500940/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/blog-post_08.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/4041248015637500940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/4041248015637500940'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/blog-post_08.html' title='Похолодало'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qffKi9eNTwo/TF7yTqNDZ7I/AAAAAAAAAB8/6IxXjp2G4D4/s72-c/08082010008.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-8350569363988021759</id><published>2010-08-04T05:27:00.000-07:00</published><updated>2010-08-04T05:27:10.632-07:00</updated><title type='text'>First results of test - mp3 (id3v2)</title><content type='html'>&lt;b&gt;Old ID3EndAnalyzer:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./Rammstein - Mann gegen Mann.mp3&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment&lt;br /&gt;                "[Xakep Online]              ";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated&lt;br /&gt;                "2005";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;                "7096320";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;                "";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1230225080";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "audio/mpeg",&lt;br /&gt;                "audio/mpeg";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title&lt;br /&gt;                "Mann gegen Mann";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./Rammstein - Mann gegen Mann.mp3";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator&lt;br /&gt;                "Rammstein";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#publisher&lt;br /&gt;                ":nwlrb";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#averageBitrate&lt;br /&gt;                "128000";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#channels&lt;br /&gt;                "2";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#codec&lt;br /&gt;                "MP3";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "Rammstein - Mann gegen Mann.mp3";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#sampleRate&lt;br /&gt;                "44100";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre&lt;br /&gt;                "Rock";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicAlbum&lt;br /&gt;                ":bmqbh";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#trackNumber&lt;br /&gt;                "2";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicPiece",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;:bmqbh&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title&lt;br /&gt;                "Rosenrot";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicAlbum".&lt;br /&gt;:nwlrb&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "LAME 3.90.3+mod";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Generated Mp3EndAnalyzer by Translator:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./Rammstein - Mann gegen Mann.mp3                                                                       &lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize                            &lt;br /&gt;                "7096320";                                                                                &lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf                               &lt;br /&gt;                "";                                                                                       &lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1230225080";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "audio/mpeg",&lt;br /&gt;                "audio/mpeg";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title&lt;br /&gt;                "Mann gegen Mann";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./Rammstein - Mann gegen Mann.mp3";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#publisher&lt;br /&gt;                ":cdarz";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "Rammstein - Mann gegen Mann.mp3";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#composer&lt;br /&gt;                ":hiddq";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre&lt;br /&gt;                "(17)";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#lyricist&lt;br /&gt;                ":owkky";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicAlbum&lt;br /&gt;                ":nwlrb";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#performer&lt;br /&gt;                ":bmqbh";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#trackNumber&lt;br /&gt;                "2";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicPiece",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;:bmqbh&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "Rammstein";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact".&lt;br /&gt;:cdarz&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "LAME 3.90.3+mod";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact".&lt;br /&gt;:hiddq&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "Rammstein";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact".&lt;br /&gt;:nwlrb&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title&lt;br /&gt;                "Rosenrot";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicAlbum".&lt;br /&gt;:owkky&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Extractor test: &lt;/b&gt;&lt;br /&gt;myvector stores 9 numbers.&lt;br /&gt;Name=Publisher Value = LAME 3.90.3+mod&lt;br /&gt;Name=Title Value = Mann gegen Mann&lt;br /&gt;Name=Publisher Value = Po-X&lt;br /&gt;Name=Genre Value = (17)&lt;br /&gt;Name=Album Value = Rosenrot&lt;br /&gt;Name=Performer Value = Rammstein&lt;br /&gt;Name=Track_number Value = 2&lt;br /&gt;Name=Composer Value = Rammstein&lt;br /&gt;Name=Performer Value = Rammstein&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TFL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Format mp3;&lt;br /&gt;&lt;br /&gt;Metadata: id3v2, id3v1;&lt;br /&gt;&lt;br /&gt;if(id3v2)&lt;br /&gt;{&lt;br /&gt; Created = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated";&lt;br /&gt; Subject = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#subject";&lt;br /&gt; Title =  "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title";&lt;br /&gt; Description = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description"; &lt;br /&gt; Comment = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment";&lt;br /&gt; Artist = "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator";&lt;br /&gt; Album =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicAlbum";&lt;br /&gt; Genre =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre";&lt;br /&gt; Composer =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#composer";&lt;br /&gt; Performer =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#performer";&lt;br /&gt; Liricist =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#lyricist";&lt;br /&gt; Publisher = "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#publisher";&lt;br /&gt; Language = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#landuage";&lt;br /&gt; Copyright = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#copyright";&lt;br /&gt; Track_number =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#trackNumber";&lt;br /&gt; Duration = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#duration";&lt;br /&gt; Bitrate = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#averageBitrate";&lt;br /&gt; Samplerate = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#sampleRate";&lt;br /&gt; Codec = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#codec";&lt;br /&gt; Channels = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#channels";&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &amp;type = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";&lt;br /&gt; &amp;fullname =  "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname";&lt;br /&gt; &amp;titleProperty =  "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title";&lt;br /&gt; &amp;albumTrackCount = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#albumTrackCount";&lt;br /&gt; &amp;discNumber = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#setNumber";&lt;br /&gt; &amp;discCount = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#setCount";&lt;br /&gt; &amp;musicClass = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicPiece";&lt;br /&gt; &amp;audioClass = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio";&lt;br /&gt; &amp;albumClass = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicAlbum";&lt;br /&gt; &amp;contactClass =  "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact";&lt;br /&gt;&lt;br /&gt; Uri a, a1, a2, a3, a4;&lt;br /&gt;&lt;br /&gt; T: a1 - type - contactClass;&lt;br /&gt; T: a1 - fullname - Performer;&lt;br /&gt;&lt;br /&gt; T: a2 - type - contactClass;&lt;br /&gt; T: a2 - fullname - Publisher;&lt;br /&gt;&lt;br /&gt; T: a - titleProperty - Album;&lt;br /&gt; T: a - type - albumClass;&lt;br /&gt;&lt;br /&gt; T: a3 - type - contactClass;&lt;br /&gt; T: a3 - fullname - Liricist;&lt;br /&gt;&lt;br /&gt; T: a4 - type - contactClass;&lt;br /&gt; T: a4 - fullname - Composer;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; D: type - musicClass;&lt;br /&gt; D: type - audioClass;&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Binary id3v2;&lt;br /&gt;&lt;br /&gt;ByteOrder=MSB;&lt;br /&gt;BitOrder=MSB;&lt;br /&gt;&lt;br /&gt;StartMetadataKey ID3(offset=0, size=3);&lt;br /&gt;checkKey(ID3)="ID3";&lt;br /&gt;&lt;br /&gt;MetadataKey HeaderFlag(start, offset=5, size=1);&lt;br /&gt;&lt;br /&gt;MetadataKey ID3_size(start, offset=6, size=4);&lt;br /&gt;&lt;br /&gt;MetadataSize=getNumber(ID3_size);&lt;br /&gt;&lt;br /&gt;if (getBit(HeaderFlag, 6)==1)&lt;br /&gt;{&lt;br /&gt;  MetadataKey ExHeaderSize(start, offset=10, size=4);&lt;br /&gt;  MetadataKey FirstFrameID(start, offset=getNumber(ExHeaderSize)+10, size=4);&lt;br /&gt;  MetadataSize-=(10+getNumber(ExHeaderSize));&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;  MetadataKey FirstFrameID(start, offset=10, size=4);&lt;br /&gt;&lt;br /&gt;key=FirstFrameID;&lt;br /&gt;while(MetadataSize&gt;0)&lt;br /&gt;{&lt;br /&gt;  MetadataKey sizeOfTag(key, offset=0, size=4);&lt;br /&gt;  if(getByte(key, 0)==0x00)&lt;br /&gt;  {&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;    TagSize=getNumber(sizeOfTag);&lt;br /&gt;    if((getValue(key)=="TALB" || getValue(key)=="TOAL") &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      SetTag Album(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TCOM" &amp;&amp; (TagSize&gt;1))&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Composer(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if((getValue(key)=="TYAR" || getValue(key)=="TDRL" || getValue(key)=="TDAT" || getValue(key)=="TDRC") &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Created(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TRCK" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Track_number(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TIT2" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Title(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TIT1" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Subject(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TIT3" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Description(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if((getValue(key)=="TPE1" || getValue(key)=="TPE2" || getValue(key)=="TPE3" || getValue(key)=="TPE4")&amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Performer(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if((getValue(key)=="TPUB" || getValue(key)=="TENC")&amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Publisher(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TEXT" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Liricist(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TCON" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Genre(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TLAN" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Language(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TCOP" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Copyright(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    if(getValue(key)=="TLEN" &amp;&amp; TagSize&gt;1)&lt;br /&gt;    {&lt;br /&gt;      MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;      setTag Duration(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    MetadataSize-=(10+getNumber(sizeOfTag));&lt;br /&gt;    shift(key, 6+getNumber(sizeOfTag));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-8350569363988021759?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/8350569363988021759/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-mp3-id3v2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/8350569363988021759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/8350569363988021759'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-mp3-id3v2.html' title='First results of test - mp3 (id3v2)'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-2164711893409169567</id><published>2010-08-04T03:06:00.000-07:00</published><updated>2010-08-04T03:06:06.349-07:00</updated><title type='text'>First results of test - png</title><content type='html'>&lt;b&gt;Old PngEndAnalyzer:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./2.png&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;                "145620";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;                "";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1278429356";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "image/png",&lt;br /&gt;                "image/png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./2.png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;                "32";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "2.png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;                "415";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode&lt;br /&gt;                "None";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;                "800";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Generated PngEndAnalyzer by Translator:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./2.png&lt;br /&gt;        http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm&lt;br /&gt;                "6";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;                "145620";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;                "";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1278429356";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "image/png",&lt;br /&gt;                "image/png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./2.png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator&lt;br /&gt;                ":nwlrb";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;                "32";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "2.png";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;                "415";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode&lt;br /&gt;                "0";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;                "800";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;:nwlrb&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;                "";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Extractor test: &lt;/b&gt;&lt;br /&gt;myvector stores 7 numbers.&lt;br /&gt;Name=Width Value = 800&lt;br /&gt;Name=Height Value = 415&lt;br /&gt;Name=Color_type Value = 8&lt;br /&gt;Name=Compression_method Value = 6&lt;br /&gt;Name=ColorDept Value = 32&lt;br /&gt;Name=Filter_method Value = 0&lt;br /&gt;Name=Interlace_method Value = 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TFL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Format Png;&lt;br /&gt;&lt;br /&gt;Metadata: PngChunk;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(PngChunk)&lt;br /&gt;{&lt;br /&gt;  Width = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width";&lt;br /&gt;  Height = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height";&lt;br /&gt;  ColorDepth= "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth";&lt;br /&gt;  Compression_method = "http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm";&lt;br /&gt;  Interlace_method = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode";&lt;br /&gt;  Title="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title";&lt;br /&gt;  Author="http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator";&lt;br /&gt;  Description="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description";&lt;br /&gt;  Copyright="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#copyright";&lt;br /&gt;  Creation_time="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated";&lt;br /&gt;  Software="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#generator";&lt;br /&gt;  Dislaimer="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#disclaimer";&lt;br /&gt;  Warning="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment";&lt;br /&gt;  Source="http://www.semanticdesktop.org/ontologies/2007/05/10/nexif#model";&lt;br /&gt;  Comment="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment";&lt;br /&gt;&lt;br /&gt;  &amp;type="http://www.w3.org/1999/02/22-rdf-syntax-ns#type";&lt;br /&gt;  &amp;fullname="http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname";&lt;br /&gt;  &amp;contactClass= "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact";&lt;br /&gt;  &amp;rasterImage = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage";&lt;br /&gt;  Uri a;&lt;br /&gt;  T: a - type - contactClass;&lt;br /&gt;  T: a - fullname - Author;&lt;br /&gt;&lt;br /&gt;  D: type - rasterImage;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Binary PngChunk;&lt;br /&gt;&lt;br /&gt;ByteOrder=MSB;&lt;br /&gt;BitOrder=MSB;&lt;br /&gt;&lt;br /&gt;StartMetadataKey MagicHex(offset=0, size=8);&lt;br /&gt;checkKey(MagicHex)=0x89504e470d0a1a0a;&lt;br /&gt;&lt;br /&gt;MetadataKey length(MagicHex, offset=0, size=4);&lt;br /&gt;MetadataKey chunkname(length, offset=0, size=4);&lt;br /&gt;MetadataKey data(chunkname, offset=0, size=getNumber(length));&lt;br /&gt;MetadataKey crc(data, offset=0, size=4);&lt;br /&gt;&lt;br /&gt;while(getValue(chunkname)!="IEND")&lt;br /&gt;{&lt;br /&gt;  if(getValue(chunkname)=="IHDR")&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;    MetadataKey width(chunkname, offset=0, size=4);&lt;br /&gt;    SetTag Width(getNumber(width));&lt;br /&gt;&lt;br /&gt;    MetadataKey height(width, offset=0, size=4);&lt;br /&gt;    SetTag Height(getNumber(height));&lt;br /&gt;&lt;br /&gt;    MetadataKey ColorType(height, offset=0, size=1);&lt;br /&gt;    SetTag Color_type(getNumber(ColorType));&lt;br /&gt;&lt;br /&gt;    MetadataKey Compression(ColorType, offset=0, size=1);&lt;br /&gt;    SetTag Compression_method(getNumber(Compression));&lt;br /&gt;&lt;br /&gt;    if(getNumber(Compression)==2) &lt;br /&gt;    {&lt;br /&gt;      n=3*getNumber(ColorType);&lt;br /&gt;      SetTag ColorDepth(n);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if(getNumber(Compression)==4) &lt;br /&gt;    {&lt;br /&gt;      n=2*getNumber(ColorType);&lt;br /&gt;      SetTag ColorDepth(n);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if(getNumber(Compression)==6) &lt;br /&gt;    {&lt;br /&gt;      n=4*getNumber(ColorType);&lt;br /&gt;      SetTag ColorDepth(n);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    MetadataKey Filter(Compression, offset=0, size=1);&lt;br /&gt;    SetTag Filter_method(getNumber(Filter));&lt;br /&gt;&lt;br /&gt;    MetadataKey Interlace(Filter, offset=0, size=1);&lt;br /&gt;    SetTag Interlace_method(getNumber(Interlace));&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if(getValue(chunkname)=="tEXt")&lt;br /&gt;  {&lt;br /&gt;    keyword=getStringByLink(chunkname,offset=0);&lt;br /&gt;    n=getLength(keyword);&lt;br /&gt;    datatext=getStringByLink(chunkname,offset=n+1);&lt;br /&gt;    if(keyword=="Title") SetTag Title(datatext);&lt;br /&gt;    if(keyword=="Author") SetTag Author(datatext);&lt;br /&gt;    if(keyword=="Description") SetTag Description(datatext);&lt;br /&gt;    if(keyword=="Copyright") SetTag Copyright(datatext);&lt;br /&gt;    if(keyword=="Creation Time") SetTag Creation_time(datatext);&lt;br /&gt;    if(keyword=="Software") SetTag Software(datatext);&lt;br /&gt;    if(keyword=="Disclaimer") SetTag Disclaimer(datatext);&lt;br /&gt;    if(keyword=="Warning") SetTag Warning(datatext);&lt;br /&gt;    if(keyword=="Source") SetTag Source(datatext);&lt;br /&gt;    if(keyword=="Comment") SetTag Comment(datatext);&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;    oldlength=getNumber(length);&lt;br /&gt;    shift(length, 8+oldlength);&lt;br /&gt;    newlength=getNumber(length);&lt;br /&gt;    shift(chunkname, 8+oldlength);&lt;br /&gt;    shift(data, 12);&lt;br /&gt;    shift(crc, 8+newlength);&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-2164711893409169567?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/2164711893409169567/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-png.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2164711893409169567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2164711893409169567'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-png.html' title='First results of test - png'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-5070158711985904685</id><published>2010-08-03T22:18:00.000-07:00</published><updated>2010-08-03T22:18:51.339-07:00</updated><title type='text'>First results of test - bmp</title><content type='html'>&lt;b&gt;Old bmpEndAnalyzer:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./test.bmp&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;                "921654";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;                "";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1280740186";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "image/bmp",&lt;br /&gt;                "image/bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./test.bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;                "24";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "test.bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;                "480";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;                "640";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Generated bmpEndAnalyzer by Translator:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;./test.bmp&lt;br /&gt;        http://freedesktop.org/standards/xesam/1.0/core#formatSubtype&lt;br /&gt;                "Windows Bitmap";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;                "921654";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;                "";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;                "1280740186";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;                "image/bmp",&lt;br /&gt;                "image/bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;                "./test.bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;                "24";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;                "test.bmp";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;                "480";&lt;br /&gt;        http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;                "640";&lt;br /&gt;        http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage",&lt;br /&gt;                "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TFL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Format Bmp;&lt;br /&gt;Metadata: BmpInfoHeader;&lt;br /&gt;&lt;br /&gt;if(BmpInfoHeader)&lt;br /&gt;{&lt;br /&gt;  Type = "http://freedesktop.org/standards/xesam/1.0/core#formatSubtype";&lt;br /&gt;  Compression = "http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm";&lt;br /&gt;  Width = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width";&lt;br /&gt;  Height = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height";&lt;br /&gt;  Color = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth";&lt;br /&gt;  &lt;br /&gt;  &amp;rdftype = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";&lt;br /&gt;  &amp;rasterImage = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage";&lt;br /&gt;&lt;br /&gt;  D: rdftype - rasterImage;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TL input file:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Binary BmpInfoHeader;&lt;br /&gt;&lt;br /&gt;StartMetadataKey BM(offset=0, size=2);&lt;br /&gt;checkKey(BM)="BM";&lt;br /&gt;&lt;br /&gt;if(getString(BM)=="BM") SetTag Type("Windows Bitmap");&lt;br /&gt;&lt;br /&gt;MetadataKey Width(start, offset=18, size=4);&lt;br /&gt;SetTag Width(getNumber(Width));&lt;br /&gt;&lt;br /&gt;MetadataKey Height(Width, offset=0, size=4);&lt;br /&gt;SetTag Height(getNumber(Height));&lt;br /&gt;&lt;br /&gt;MetadataKey BitCount(Height, offset=2, size=2);&lt;br /&gt;SetTag Color(getNumber(BitCount));&lt;br /&gt;&lt;br /&gt;MetadataKey Compression(BitCount, offset=0, size=4);&lt;br /&gt;if(getNumber(Compression)==0) setTag Campression("None");&lt;br /&gt;if(getNumber(Compression)==1) setTag Campression("RLE 8bit/pixel");&lt;br /&gt;if(getNumber(Compression)==2) setTag Campression("RLE 4bit/pixel");&lt;br /&gt;if(getNumber(Compression)==3) setTag Campression("Bit fields");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-5070158711985904685?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/5070158711985904685/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-bmp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/5070158711985904685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/5070158711985904685'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/first-results-of-test-bmp.html' title='First results of test - bmp'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-4319958443619134612</id><published>2010-08-01T07:45:00.000-07:00</published><updated>2010-08-01T07:57:48.597-07:00</updated><title type='text'>И даже работает...</title><content type='html'>Мы строили строили и наконец — запустили нормальный тест со стрижами, и даже что-то заработало.&lt;br /&gt;&lt;br /&gt;Старый парсер выдает это для Png:&lt;br /&gt;./test.png&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;"49237";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;"";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;"1280592673";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;"image/png",&lt;br /&gt;"image/png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;"./test.png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;"8";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;"test.png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;"450";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode&lt;br /&gt;"None";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;"600";&lt;br /&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;"http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage",&lt;br /&gt;"http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;&lt;br /&gt;Новый это:&lt;br /&gt;&lt;br /&gt;./test.png&lt;br /&gt;http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm &lt;br /&gt;"3";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize&lt;br /&gt;"49237";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#isPartOf&lt;br /&gt;"";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified&lt;br /&gt;"1280592673";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType&lt;br /&gt;"image/png",&lt;br /&gt;"image/png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url&lt;br /&gt;"./test.png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator&lt;br /&gt;":nwlrb";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth&lt;br /&gt;"8";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName&lt;br /&gt;"test.png";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height&lt;br /&gt;"450";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode&lt;br /&gt;"0";&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width&lt;br /&gt;"600";&lt;br /&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;br /&gt;"http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject".&lt;br /&gt;:nwlrb&lt;br /&gt;http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname&lt;br /&gt;"";&lt;br /&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type &lt;br /&gt;"http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Не в десятку, но это уже минус входного файла — нужно сесть и все по-человечески доделать. Есть еще недоделки(большие и не очень) и баги,  но тут два позитивных момента 1) я о них знаю 2) по ходу все можно доделать/исправить — не смертельно. Ура, начинаем тесты!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-4319958443619134612?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/4319958443619134612/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/4319958443619134612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/4319958443619134612'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/08/blog-post.html' title='И даже работает...'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-3844770049660303273</id><published>2010-07-29T12:44:00.000-07:00</published><updated>2010-07-29T12:47:12.089-07:00</updated><title type='text'>TFL examples - mp3</title><content type='html'>Format mp3;&lt;br /&gt;&lt;br /&gt;Metadata: id3v2, id3v1;&lt;br /&gt;&lt;br /&gt;if(id3v2)&lt;br /&gt;{&lt;br /&gt; created = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated";&lt;br /&gt; subject = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#subject";&lt;br /&gt; title =  "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title";&lt;br /&gt; description = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description"; &lt;br /&gt; comment = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment";&lt;br /&gt; artist = "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator";&lt;br /&gt; album =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicAlbum";&lt;br /&gt; genre =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#genre";&lt;br /&gt; composer =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#composer";&lt;br /&gt; performer =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#performer";&lt;br /&gt; liricist =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#lyricist";&lt;br /&gt; publisher = "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#publisher";&lt;br /&gt; language = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#landuage";&lt;br /&gt; copyright = "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#copyright";&lt;br /&gt; trackNumber =  "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#trackNumber";&lt;br /&gt; duration = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#duration";&lt;br /&gt; bitrate = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#averageBitrate";&lt;br /&gt; samplerate = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#sampleRate";&lt;br /&gt; codec = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#codec";&lt;br /&gt; channels = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#channels";&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &amp;type = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";&lt;br /&gt; &amp;fullname =  "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname";&lt;br /&gt; &amp;titleProperty =  "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title";&lt;br /&gt; &amp;albumTrackCount = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#albumTrackCount";&lt;br /&gt; &amp;discNumber = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#setNumber";&lt;br /&gt; &amp;discCount = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#setCount";&lt;br /&gt; &amp;musicClass = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#musicPiece";&lt;br /&gt; &amp;audioClass = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio";&lt;br /&gt; &amp;albumClass = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicAlbum";&lt;br /&gt; &amp;contactClass =  "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#contact";&lt;br /&gt;&lt;br /&gt; Uri a, a1, a2, a3, a4, a5;&lt;br /&gt;&lt;br /&gt; T: a1 - type - contactClass;&lt;br /&gt; T: a1 - fullname - performer;&lt;br /&gt;&lt;br /&gt; T: a2 - type - contactClass;&lt;br /&gt; T: a2 - fullname - publisher;&lt;br /&gt;&lt;br /&gt; T: a - titleProperty - album;&lt;br /&gt; T: a - type - albumClass;&lt;br /&gt;&lt;br /&gt; T: a3 - type - contactClass;&lt;br /&gt; T: a3 - fullname - liricist;&lt;br /&gt;&lt;br /&gt; T: a4 - type - contactClass;&lt;br /&gt; T: a4 - fullname - composer;&lt;br /&gt;&lt;br /&gt; T: a5- albumTrackCount - trackNumber;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-3844770049660303273?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/3844770049660303273/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/tfl-examples-mp3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/3844770049660303273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/3844770049660303273'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/tfl-examples-mp3.html' title='TFL examples - mp3'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-2270524812490213368</id><published>2010-07-14T10:34:00.000-07:00</published><updated>2010-07-15T00:58:24.401-07:00</updated><title type='text'>The first results</title><content type='html'>&lt;p&gt;The goal of project it is a creating of parsers generator for Strigi.  Input of generator it is two file. First – describing of metadata format, second – mapping (it is shows how is related tags of metadata and ontology). I separated it for two reasons:  1) one format can has two or more type of metadata (different version of metadata format or new universal formal like xmp) 2) testing grammar really simpler when it is separated.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;My first step it is developing of a language for describing metadata format and language for describing the mapping.  I created language base on png, exif, id3, vorbis comment and xmp (last 2 a little bit). The language for metadata it is Tag language (TL – short name) and it is contain main item MetadataKey. This is example for png (file pngchunk.txt)&lt;br /&gt;/* key word Binary means that description starts and MetadataKey is defined by offset and size.  I planned to expand the language for finding tag by key word and if it necessary it will start by Text key word.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;PngChung it name and prefix for future class of extractor */&lt;br /&gt;&lt;strong&gt;1 Binary PngChunk;&lt;br /&gt;2&lt;/strong&gt;&lt;br /&gt;/* ByteOrder и BitOrder it is order a byte and bit. If it is not defined it will  LSB.*/&lt;br /&gt;&lt;strong&gt;3 ByteOrder=MSB;&lt;br /&gt;4 BitOrder=MSB;&lt;br /&gt;5&lt;/strong&gt;&lt;br /&gt;/*StartMetadataKey – it is the first key that define type of metadata.  Offset for this key from beginning of file. */&lt;br /&gt;&lt;strong&gt;6 StartMetadataKey IHDR(offset=12, size=4);&lt;/strong&gt;&lt;br /&gt;/* Checking value of key. It is required for StartMetadataKey and can to check a string or a hex value.*/&lt;br /&gt;&lt;strong&gt;7 checkKey(IHDR)="IHDR";&lt;br /&gt;8&lt;/strong&gt;&lt;br /&gt;/*MetadataKey –region that contains tag. It can defined by base key (or key word “start”), offset and size. If first parameter is “start” then offset for key from beginning of file. If first parameter is another MetadataKey the offset for key from end base key. */&lt;br /&gt;&lt;strong&gt;9 MetadataKey width(IHDR, offset=0, size=4);&lt;/strong&gt;&lt;br /&gt;/* Creating tag with name “Widht” and with number value  that is saved by MetadataKey. Currently I can get only string and int32 types. But I will expand it for double and int64 in future. */&lt;br /&gt;1&lt;strong&gt;0 SetTag Width(getNumber(width));&lt;br /&gt;11&lt;br /&gt;12 MetadataKey height(width, offset=0, size=4);&lt;br /&gt;13 SetTag Height(getNumber(height));&lt;br /&gt;14&lt;br /&gt;15 MetadataKey ColorType(height, offset=0, size=1);&lt;br /&gt;16 SetTag Color_type(getNumber(ColorType));&lt;br /&gt;17&lt;br /&gt;18 MetadataKey Compression(ColorType, offset=0, size=1);&lt;br /&gt;19 SetTag Compression_method(getNumber(Compression));&lt;br /&gt;20&lt;br /&gt;21 MetadataKey Filter(Compression, offset=0, size=1);&lt;br /&gt;22 SetTag Filter_method(getNumber(Filter));&lt;br /&gt;23&lt;br /&gt;24 MetadataKey Interlace(Filter, offset=0, size=1);&lt;br /&gt;25 SetTag Interlace_method(getNumber(Interlace));&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Additional functions:&lt;br /&gt;&lt;strong&gt;getNumberByLink(key, offset, size)  &lt;/strong&gt;or &lt;strong&gt;getNumberByLink(offset, size)&lt;/strong&gt; – get number by offset and size. If key is not defined offset from beginning of file.&lt;br /&gt;&lt;strong&gt;getStringByLink(key, offset, size)&lt;/strong&gt;, &lt;strong&gt;getStringByLink( offset, size), getStringByLink(key, offset), getStringByLink( offset)&lt;/strong&gt; –  get string by offset.  If key is not defined offset from beginning of file. If size is not defined it get all until symbol end of string or end of file.&lt;br /&gt;&lt;strong&gt;getValueByLink(key, offset, size),  getValueByLink(offset, size) &lt;/strong&gt;– get data without  type conversion. 9never used but exist).&lt;br /&gt;All this function it is short variant of MetadataKey + getValue (getString, getNumber)&lt;br /&gt;&lt;br /&gt;Functions:&lt;br /&gt;&lt;strong&gt;shift(key,n)&lt;/strong&gt; – moved key on n steps .&lt;br /&gt;&lt;strong&gt;getBit(key,n)&lt;/strong&gt; – get bit number n inside key.&lt;br /&gt;&lt;strong&gt;getByte(key, n)&lt;/strong&gt; – get byte number n inside key.&lt;br /&gt;(You can fine examples of using these functions in files id3tag.txt и exif.txt)&lt;br /&gt;&lt;br /&gt;And of course I implemented loop (currently only wile) and if- else&lt;br /&gt;&lt;br /&gt;Language for mapping I called – Tiny Format language or shot TFL. For png example (file png_triplex.txt):&lt;br /&gt;/* Format  it is key word.  After this key word follow prefix for EndAnalyzer class.*/&lt;br /&gt;&lt;strong&gt;1 Format Png;&lt;br /&gt;2&lt;/strong&gt;&lt;br /&gt;/* Metadata – key word defined list of name of formats metadata .   Png has only one type of metadata – it PngChunk*/&lt;br /&gt;&lt;strong&gt;3 Metadata: PngChunk;&lt;br /&gt;4&lt;br /&gt;5&lt;/strong&gt;&lt;br /&gt;/* It checking  StartMetadataKey. If it is true then triplex creates according to mapping inside this if .*/&lt;br /&gt;&lt;strong&gt;6 if(PngChunk)&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;7 {&lt;/strong&gt;&lt;br /&gt;/* The name of tag here has to be same name of tag that was been created by setTag function in file pngchunk.txt */&lt;br /&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;strong&gt;   With = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width";&lt;br /&gt;9   Height = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height";&lt;br /&gt;10   Color_type= "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth";&lt;br /&gt;11   Compression_method = "http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm";&lt;br /&gt;12   Interlace_method = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode";&lt;br /&gt;13&lt;br /&gt;14 }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Second step it is writing of translator for TFL and TL languages.  Each translator contains scanner, parser and generator of c++ code.  For developing of scanner and parser I used coco/r generator.  It doesn’t have tool for testing and debug grammar (like AntlrWorks for antlr) but it has more clear documentation.  The result of working of the TL translator it is class extractor which extracts tag and  saves it in vector of Tag.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;/*files  PngChunkextractor.h  и PngChunkextractor.cpp  after working TL translator*/&lt;br /&gt;&lt;strong&gt;1 #ifndef PngChunkExtractor_H_&lt;br /&gt;2 #define PngChunkExtractor_H_&lt;br /&gt;3 #include "MetadataKey.h"&lt;br /&gt;4 #include "Tag.h"&lt;br /&gt;5 #include "MetadataFunc.h"&lt;br /&gt;6 #include &lt;vector&gt;&lt;br /&gt;7 #include &lt;fstream&gt;&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10 class PngChunkExtractor {&lt;br /&gt;11 public:&lt;br /&gt;12 PngChunkExtractor(std::ifstream _is) {is=_is;}&lt;br /&gt;13 std::vector&lt;tag&gt; toExtract();&lt;br /&gt;14 bool toCheck();&lt;br /&gt;15 private:&lt;br /&gt;16 std::ifstream is;&lt;br /&gt;17 };&lt;br /&gt;18 #endif&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The result of working of the TFL translator it is class inheritance from StreamEndAnalyzer class.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;/*  files Pngendanalyzer.h  и Pngendanalyzer.cpp  after working of TFL translator */&lt;br /&gt;&lt;strong&gt;1 #include "Pngendanalyzer.h"&lt;br /&gt;2 #include &lt;strigi h=""&gt;&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5 void PngEndAnalyzerFactory::registerFields(FieldRegister&amp;amp; reg) {&lt;br /&gt;6 RF["PngChunk_Color_typeField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth");&lt;br /&gt;7 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth");&lt;br /&gt;8 RF["PngChunk_Compression_methodField"]=reg.registerField("http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm");&lt;br /&gt;9 addField("http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm");&lt;br /&gt;10 RF["PngChunk_HeightField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height");&lt;br /&gt;11 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height");&lt;br /&gt;12 RF["PngChunk_Interlace_methodField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode");&lt;br /&gt;13 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode");&lt;br /&gt;14 RF["PngChunk_WithField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width");&lt;br /&gt;15 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width");&lt;br /&gt;16 }&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19 signed char PngEndAnalyzer::analyze(AnalysisResult&amp;amp; as, InputStream* in) {&lt;br /&gt;20 int flag=-1;&lt;br /&gt;21 PngChunkExtractor PngChunk(InputStream* in);&lt;br /&gt;22 if(PngChunk.toCheck()){&lt;br /&gt;23 std::vector&lt;tag&gt; tag_v=PngChunk.toExtract();&lt;br /&gt;24 flag=0;&lt;br /&gt;25 for(int i=0; i&lt;tag_v.size(); 26="" 27="" tag="" t="tag_v[i];" 28="" int="" n="t.getType();" 29="" string="" name="PngChunk_" 30="" 31="" 32="" 33="" case=""&gt;getField(name), t.getNumber()); break;&lt;br /&gt;34 case 2: as.addValue(factory-&gt;getField(name), t.getString()); break;&lt;br /&gt;35 }&lt;br /&gt;36 name.clear();&lt;br /&gt;37 }&lt;br /&gt;38 return flag;&lt;br /&gt;39 }&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Next steps:&lt;br /&gt;1. To rewrite the MetadataKey for working with InputStream (I think I have done it, but didn’t test well)&lt;br /&gt;2. To add opportunity in TL language to get double type.&lt;br /&gt;3. To add in TFL triplex creating.&lt;br /&gt;4. To add the message about declaration error, encoding and another things that I missed.&lt;br /&gt;&lt;br /&gt;Link:&lt;br /&gt;http://gitorious.org/strigi/strigi-grammar/trees/master/Translator&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-2270524812490213368?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/2270524812490213368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/first-results.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2270524812490213368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2270524812490213368'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/first-results.html' title='The first results'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-8565330559758808309</id><published>2010-07-13T10:09:00.000-07:00</published><updated>2010-07-13T10:17:58.834-07:00</updated><title type='text'>Экватор - Первые итоги</title><content type='html'>&lt;p&gt;Экватор - Первые итоги&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Итак, цель проекта - написать генератор парсеров для Strigi. Т.е. на вход подается описание формата метаданных и описание того как соотносятся теги и свойства онтологий, а на выходе получался бы парсер который бы извлекал теги и создавал бы триплексы.  С чего я начала:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. С чтения документации форматов метаданных (т.е. только ту часть которая описывает метаданные). Пока осилила только png, exif(jpg),  id3(mp3),  немного Vorbis comment (flac) и xmp. После этого увлекательного чтения нужно было придумать свой язык для описания метаданных. Вот это как раз было самым сложным этапом работы и прежде чем прейди к какому-то жизнеспособному решению я сделала штуки 3 неудачных попытки.  Язык я назвала Tag language  или сокращенно TL–оригинально :) И ключевым элементом в нем стал MetadataKey. На примере png (файл pngtag.txt):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;/* Ключевое слово Binary означает старт  + обозначает способ задания MetadataKey по смещения и размеру (планируется что дальше я расширю язык для извлечения тегов по ключевому слову, тогда для такого формата описание будет начинаться с ключевого слова Text). PngChunk – имя нашего описания, а так же префикс для будущего класса.*/&lt;br /&gt;1 Binary PngChunk;&lt;br /&gt;2&lt;br /&gt;/* ByteOrder и BitOrder порядок байтов и битов. Если эти константы не заданы, то по умолчанию  они будут равны LSB.*/&lt;br /&gt;3 ByteOrder=MSB;&lt;br /&gt;4 BitOrder=MSB;&lt;br /&gt;5&lt;br /&gt;/*StartMetadataKey – это самый первый тег который определяет что те самые метаданные.  offset для этого ключа задается всегда от начала файла. */&lt;br /&gt;6 StartMetadataKey IHDR(offset=12, size=4);&lt;br /&gt;/*Проверка значения ключа. Для StartMetadataKey –обязательна и может проверять значение строки (как указано ниже) или hex.*/&lt;br /&gt;7 checkKey(IHDR)="IHDR";&lt;br /&gt;8&lt;br /&gt;/*MetadataKey –область  в которой хранятся нужные нам данные. Задается тремя параметрами:&lt;br /&gt;другой MetadataKey или ключевой слово start, означающее начало файла. Этот параметр указывает точку относительно которой будет считаться смещение. В случае если указан MetadataKey – это конец ключа&lt;br /&gt;offset - смещение&lt;br /&gt;size – размер ключа*/&lt;br /&gt;9 MetadataKey width(IHDR, offset=0, size=4);&lt;br /&gt;/*Создаем тег с именем Widht с целочисленным значением, которое храниться в MetadataKey*/&lt;br /&gt;10 SetTag Width(getNumber(width));&lt;br /&gt;11&lt;br /&gt;12 MetadataKey height(width, offset=0, size=4);&lt;br /&gt;13 SetTag Height(getNumber(height));&lt;br /&gt;14&lt;br /&gt;15 MetadataKey ColorType(height, offset=0, size=1);&lt;br /&gt;16 SetTag Color_type(getNumber(ColorType));&lt;br /&gt;17&lt;br /&gt;18 MetadataKey Compression(ColorType, offset=0, size=1);&lt;br /&gt;19 SetTag Compression_method(getNumber(Compression));&lt;br /&gt;20&lt;br /&gt;21 MetadataKey Filter(Compression, offset=0, size=1);&lt;br /&gt;22 SetTag Filter_method(getNumber(Filter));&lt;br /&gt;23&lt;br /&gt;24 MetadataKey Interlace(Filter, offset=0, size=1);&lt;br /&gt;&lt;/li&gt;&lt;li&gt;25 SetTag Interlace_method(getNumber(Interlace));&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Еще есть функции getNumberByLink(key, offset, size) или getNumberByLink(offset, size) – берет целое число по смещению и размеру. Если key не задан, то смещение считается от начала файла.&lt;br /&gt;getStringByLink(key, offset, size), getStringByLink( offset, size), getStringByLink(key, offset), getStringByLink( offset) – берет строку по смещению. Если key не задан, то считает смещение от начала файла. Если size не задан, то берет все пока не встретит знак конца строки или не дойдет до конца файла.&lt;br /&gt;getValueByLink(key, offset, size),  getValueByLink(offset, size) –берет значение без приведения к типу. (пока нигде не используется). Все эти функции короткая запись MetadataKey + getValue&lt;br /&gt;&lt;br /&gt;Функция shift(key,n) – сдвигает ключ key на n  позиций.&lt;br /&gt;getBit(key,n) – берет n-ый  бит в ключе key.&lt;br /&gt;getByte(key, n) – берет n-ый байт в ключе key.&lt;br /&gt;Примеры использования в файлах id3tag.txt и exif.txt&lt;br /&gt;&lt;br /&gt;Так же есть цикл (пока только while) и условия(if  - else).&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Язык для описания соответствия между тегами и онтологией я назвала Tiny Format Language – TFL.  Опять же для png (файл png_triplex.txt):&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/* Format ключевое слово, после которого идет префикс для имени класса - парсера*/&lt;br /&gt;1 Format Png;&lt;br /&gt;2&lt;br /&gt;/* Metadata – ключевое слово, за которым следует список описаний метаданных.  У png только один «вид» метаданных, а у jpg например может быть xmp или exif */&lt;br /&gt;3 Metadata: PngChunk;&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;/*Эта проверка означает, что если мы нашли StartMetadataKey и он прошел проверку, то мы сопоставляем тери и свойства в онтологиях.*/&lt;br /&gt;6 if(PngChunk)&lt;br /&gt;7 {&lt;br /&gt;/* Имя тега в этом описании должно соответствовать имени тега заданным при помощи функции setTag в файле pngtag.txt */&lt;br /&gt;8   With = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width";&lt;br /&gt;9   Height = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height";&lt;br /&gt;10   Color_type= "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth";&lt;br /&gt;11   Compression_method = "http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm";&lt;br /&gt;12   Interlace_method = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode";&lt;br /&gt;13&lt;br /&gt;&lt;/li&gt;&lt;li&gt;14 }&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;2. Далее для этих двух языков нужно было написать трансляторы. Каждый транслятор состоит из сканера, парсера и генератора кода. Для создания сканера и парсера я воспользовалась генератором coco/r.  Вообще то сначала я планировала работать с  antlr, уж очень у них удобная среда разработки и тестирования грамматики AntlrWork.  Но отношения с этим инструментом не сложились, вернее не сложились отношения с его документацией, и я решила реализовывать транслятор при помощи coco.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;В результате работы TL транслятора я получаю класс extractor, а в результате работы TFL транслятора класс парсер для strigi.&lt;br /&gt;&lt;p&gt;Вот что получается для png:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/*файлы PngChunkextractor.h  и PngChunkextractor.cpp  результат работы TL транслятора*/&lt;br /&gt;1 #ifndef PngChunkExtractor_H_&lt;br /&gt;2 #define PngChunkExtractor_H_&lt;br /&gt;3 #include "MetadataKey.h"&lt;br /&gt;4 #include "Tag.h"&lt;br /&gt;5 #include "MetadataFunc.h"&lt;br /&gt;6 #include &lt;vector&gt;&lt;br /&gt;7 #include &lt;fstream&gt;&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10 class PngChunkExtractor {&lt;br /&gt;11 public:&lt;br /&gt;12 PngChunkExtractor(std::ifstream _is) {is=_is;}&lt;br /&gt;13 std::vector&lt;tag&gt; toExtract();&lt;br /&gt;14 bool toCheck();&lt;br /&gt;15 private:&lt;br /&gt;16 std::ifstream is;&lt;br /&gt;17 };&lt;br /&gt;18 #endif&lt;br /&gt;&lt;br /&gt;/*  файлы Pngendanalyzer.h  и Pngendanalyzer.cpp – результат работы TFL - транслятора */&lt;br /&gt;1 #include "Pngendanalyzer.h"&lt;br /&gt;2 #include &lt;strigi h=""&gt;&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5 void PngEndAnalyzerFactory::registerFields(FieldRegister&amp;amp; reg) {&lt;br /&gt;6 RF["PngChunk_Color_typeField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth");&lt;br /&gt;7 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#colorDepth");&lt;br /&gt;8 RF["PngChunk_Compression_methodField"]=reg.registerField("http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm");&lt;br /&gt;9 addField("http://freedesktop.org/standards/xesam/1.0/core#compressionAlgorithm");&lt;br /&gt;10 RF["PngChunk_HeightField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height");&lt;br /&gt;11 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height");&lt;br /&gt;12 RF["PngChunk_Interlace_methodField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode");&lt;br /&gt;13 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#interlaceMode");&lt;br /&gt;14 RF["PngChunk_WithField"]=reg.registerField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width");&lt;br /&gt;15 addField("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width");&lt;br /&gt;16 }&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19 signed char PngEndAnalyzer::analyze(AnalysisResult&amp;amp; as, InputStream* in) {&lt;br /&gt;20 int flag=-1;&lt;br /&gt;21 PngChunkExtractor PngChunk(InputStream* in);&lt;br /&gt;22 if(PngChunk.toCheck()){&lt;br /&gt;23 std::vector&lt;tag&gt; tag_v=PngChunk.toExtract();&lt;br /&gt;24 flag=0;&lt;br /&gt;25 for(int i=0; i&lt;tag_v.size(); 26="" 27="" tag="" t="tag_v[i];" 28="" int="" n="t.getType();" 29="" string="" name="PngChunk_" 30="" 31="" 32="" 33="" case=""&gt;getField(name), t.getNumber()); break;&lt;br /&gt;34 case 2: as.addValue(factory-&gt;getField(name), t.getString()); break;&lt;br /&gt;35 }&lt;br /&gt;36 name.clear();&lt;br /&gt;37 }&lt;br /&gt;38 return flag;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;39 }&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Что дальше:&lt;br /&gt;&lt;br /&gt;1. Подправить классы для работы с потоками Strigi (кажется почти доделала)&lt;br /&gt;2. Добавить в TL возможность брать значения типа double&lt;br /&gt;3. Добавить в TFL возможность создавать триплексы&lt;br /&gt;4. Дописать вывод ошибок декларирования переменных, работу с кодировкой и прочие нюансы, которые я упустила.&lt;br /&gt;5.  Доделать пример с exif, png, id3, которые бы иллюстрировали все возможности языка.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ссылка на исходники:&lt;br /&gt;http://gitorious.org/strigi/strigi-grammar/trees/master/Translator&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-8565330559758808309?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/8565330559758808309/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/strigi.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/8565330559758808309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/8565330559758808309'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/strigi.html' title='Экватор - Первые итоги'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-7841039267025728999</id><published>2010-07-01T12:18:00.000-07:00</published><updated>2010-07-13T10:22:23.310-07:00</updated><title type='text'>Translator</title><content type='html'>&lt;strong&gt;Description of Exif&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;(It haven't been finished yet.)&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Binary Exif;&lt;br /&gt;&lt;br /&gt;ByteOrder=LSB;&lt;br /&gt;BitOrder=MSB;&lt;br /&gt;&lt;br /&gt;StartMetadataKey APP1_Markeer(offset=2, size=2);&lt;br /&gt;&lt;br /&gt;checkKey(APP1_Markeer)=0xFFE1;&lt;br /&gt;&lt;br /&gt;MetadataKey APP1(start, offset=2, size=10);&lt;br /&gt;MetadataKey IFD_Offset(APP1, offset=4, size=4);&lt;br /&gt;MetadataKey CountOfTag(APP1, offset=getNumber(IFD_Offset), size=2);&lt;br /&gt;MetadataKey FirstTagID(CountOfTag, offset=0, size=2);&lt;br /&gt;TagID=FirstTagID;&lt;br /&gt;&lt;br /&gt;count=getNumber(CountOfTag);&lt;br /&gt;while(count&gt;0)&lt;br /&gt;{&lt;br /&gt;MetadataKey Type(TagID, offset=0, size=2);&lt;br /&gt;MetadataKey ValueOffset(TagID, offset=6, size=4);&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x010E)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag Image_description(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag Image_description(getStringByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag Image_description(getString(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x010F)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag Make(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag Make(getStringByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag Make(getString(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x0110)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag Model(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag Model(getStringByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag Model(getString(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x0112)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag Orientation(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag Orientation(getNumberByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag Orientation(getNumber(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x011A)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag XResolution(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag XResolution(getNumberByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag XResolution(getNumber(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x011B)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag YResolution(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag YResolution(getNumberByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag YResolution(getNumber(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(getValue(TagID)==0x0132)&lt;br /&gt;{&lt;br /&gt; if(getValue(Type)==2) {SetTag DateTime(getStringByLink(APP1, offset=getNumber(ValueOffset)));}&lt;br /&gt; if(getValue(Type)==5) {SetTag DateTime(getStringByLink(TagID, offset=getNumber(ValueOffset), size=8));}&lt;br /&gt; if(getValue(Type)==1 || (getValue(Type)==3) || (getValue(Type)==4)) {SetTag DateTime(getString(ValueOffset));}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;count-=1;&lt;br /&gt;shift(TagID,10);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Is generated parser&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;#include "MetadataKey.h"&lt;br /&gt;#include "Tag.h"&lt;br /&gt;#include "MetadataFunc.h"&lt;br /&gt;#include &lt;vector&gt;&lt;br /&gt;#include &lt;fstream&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;&lt;br /&gt;std::ifstream is;&lt;br /&gt;int DefaultByteOrder=ByteOrderLSB;&lt;br /&gt;int DefaultBitOrder=BitOrderMSB;&lt;br /&gt;MetadataKey APP1;&lt;br /&gt;MetadataKey CountOfTag;&lt;br /&gt;MetadataKey FirstTagID;&lt;br /&gt;MetadataKey IFD_Offset;&lt;br /&gt;MetadataKey TagID;&lt;br /&gt;MetadataKey Type;&lt;br /&gt;MetadataKey ValueOffset;&lt;br /&gt;int count;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;std::vector&lt;tag&gt; TagArray;&lt;br /&gt;is.open ("test.mp3", std::ifstream::in | std::ifstream::binary);&lt;br /&gt;if (is.good()) {&lt;br /&gt;MetadataKey APP1_Markeer(is);&lt;br /&gt;APP1_Markeer.setOffset(2);&lt;br /&gt;APP1_Markeer.setSize(2);&lt;br /&gt;if(!checkKey(APP1_Markeer,0xFFE1)) return -1;&lt;br /&gt;APP1.setStream(is);&lt;br /&gt;APP1.setOffset(2);&lt;br /&gt;APP1.setSize(10);&lt;br /&gt;IFD_Offset.setStream(is);&lt;br /&gt;IFD_Offset.setBaseKey(APP1);&lt;br /&gt;IFD_Offset.setOffset(4);&lt;br /&gt;IFD_Offset.setSize(4);&lt;br /&gt;CountOfTag.setStream(is);&lt;br /&gt;CountOfTag.setBaseKey(APP1);&lt;br /&gt;CountOfTag.setOffset(IFD_Offset.getNumber(DefaultByteOrder));&lt;br /&gt;CountOfTag.setSize(2);&lt;br /&gt;FirstTagID.setStream(is);&lt;br /&gt;FirstTagID.setBaseKey(CountOfTag);&lt;br /&gt;FirstTagID.setOffset(0);&lt;br /&gt;FirstTagID.setSize(2);&lt;br /&gt;TagID=FirstTagID;&lt;br /&gt;count=CountOfTag.getNumber(DefaultByteOrder);&lt;br /&gt;while(count&gt;0){&lt;br /&gt;Type.setStream(is);&lt;br /&gt;Type.setBaseKey(TagID);&lt;br /&gt;Type.setOffset(0);&lt;br /&gt;Type.setSize(2);&lt;br /&gt;ValueOffset.setStream(is);&lt;br /&gt;ValueOffset.setBaseKey(TagID);&lt;br /&gt;ValueOffset.setOffset(6);&lt;br /&gt;ValueOffset.setSize(4);&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x010E){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t0;&lt;br /&gt;t0.setName("Image_description" );&lt;br /&gt;t0.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t1;&lt;br /&gt;t1.setName("Image_description" );&lt;br /&gt;t1.setValue(getStringByLink(TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t2;&lt;br /&gt;t2.setName("Image_description" );&lt;br /&gt;t2.setValue(ValueOffset.getString());&lt;br /&gt;TagArray.push_back(t2);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x010F){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t3;&lt;br /&gt;t3.setName("Make" );&lt;br /&gt;t3.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t3);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t4;&lt;br /&gt;t4.setName("Make" );&lt;br /&gt;t4.setValue(getStringByLink(TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t5;&lt;br /&gt;t5.setName("Make" );&lt;br /&gt;t5.setValue(ValueOffset.getString());&lt;br /&gt;TagArray.push_back(t5);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x0110){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t6;&lt;br /&gt;t6.setName("Model" );&lt;br /&gt;t6.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t6);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t7;&lt;br /&gt;t7.setName("Model" );&lt;br /&gt;t7.setValue(getStringByLink(TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t7);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t8;&lt;br /&gt;t8.setName("Model" );&lt;br /&gt;t8.setValue(ValueOffset.getString());&lt;br /&gt;TagArray.push_back(t8);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x0112){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t9;&lt;br /&gt;t9.setName("Orientation" );&lt;br /&gt;t9.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t9);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t10;&lt;br /&gt;t10.setName("Orientation" );&lt;br /&gt;t10.setValue(getNumberByLink(DefaultByteOrder, TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t11;&lt;br /&gt;t11.setName("Orientation" );&lt;br /&gt;t11.setValue(ValueOffset.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t11);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x011A){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t12;&lt;br /&gt;t12.setName("XResolution" );&lt;br /&gt;t12.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t12);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t13;&lt;br /&gt;t13.setName("XResolution" );&lt;br /&gt;t13.setValue(getNumberByLink(DefaultByteOrder, TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t13);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t14;&lt;br /&gt;t14.setName("XResolution" );&lt;br /&gt;t14.setValue(ValueOffset.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t14);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x011B){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t15;&lt;br /&gt;t15.setName("YResolution" );&lt;br /&gt;t15.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t15);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t16;&lt;br /&gt;t16.setName("YResolution" );&lt;br /&gt;t16.setValue(getNumberByLink(DefaultByteOrder, TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t16);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t17;&lt;br /&gt;t17.setName("YResolution" );&lt;br /&gt;t17.setValue(ValueOffset.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t17);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(TagID.getValue()==0x0132){&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==2){&lt;br /&gt;Tag t18;&lt;br /&gt;t18.setName("DateTime" );&lt;br /&gt;t18.setValue(getCString(APP1,ValueOffset.getNumber(DefaultByteOrder)));&lt;br /&gt;TagArray.push_back(t18);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==5){&lt;br /&gt;Tag t19;&lt;br /&gt;t19.setName("DateTime" );&lt;br /&gt;t19.setValue(getStringByLink(TagID,ValueOffset.getNumber(DefaultByteOrder),8));&lt;br /&gt;TagArray.push_back(t19);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(Type.getValue()==1||(Type.getValue()==3)||(Type.getValue()==4)){&lt;br /&gt;Tag t20;&lt;br /&gt;t20.setName("DateTime" );&lt;br /&gt;t20.setValue(ValueOffset.getString());&lt;br /&gt;TagArray.push_back(t20);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;count-=1;&lt;br /&gt;TagID.setOffset(10+TagID.getSize());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-7841039267025728999?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/7841039267025728999/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/translator-description-of-exif-it.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/7841039267025728999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/7841039267025728999'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/07/translator-description-of-exif-it.html' title='Translator'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-990708453628677153</id><published>2010-06-30T10:04:00.000-07:00</published><updated>2010-07-13T10:22:50.890-07:00</updated><title type='text'>Translator</title><content type='html'>&lt;p&gt;&lt;strong&gt;Description of png file&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Binary PNG;&lt;br /&gt;&lt;br /&gt;ByteOrder=MSB;&lt;br /&gt;BitOrder=MSB;&lt;br /&gt;&lt;br /&gt;StartMetadataKey IHDR(offset=12, size=4);&lt;br /&gt;&lt;br /&gt;checkKey(IHDR)="IHDR";&lt;br /&gt;&lt;br /&gt;MetadataKey width(IHDR, offset=0, size=4);&lt;br /&gt;SetTag Width(getNumber(width));&lt;br /&gt;&lt;br /&gt;MetadataKey height(width, offset=0, size=4);&lt;br /&gt;SetTag Height(getNumber(height));&lt;br /&gt;&lt;br /&gt;MetadataKey ColorType(height, offset=0, size=1);&lt;br /&gt;SetTag Color_type(getNumber(ColorType));&lt;br /&gt;&lt;br /&gt;MetadataKey Compression(ColorType, offset=0, size=1);&lt;br /&gt;SetTag Compression_method(getNumber(Compression));&lt;br /&gt;&lt;br /&gt;MetadataKey Filter(Compression, offset=0, size=1);&lt;br /&gt;SetTag Filter_method(getNumber(Filter));&lt;br /&gt;&lt;br /&gt;MetadataKey Interlace(Filter, offset=0, size=1);&lt;br /&gt;SetTag Interlace_method(getNumber(Interlace));&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Is generated parser&lt;/p&gt;&lt;p&gt;#include "MetadataKey.h"                                      &lt;br /&gt;#include "Tag.h"                                              &lt;br /&gt;#include "MetadataFunc.h"                                     &lt;br /&gt;#include &lt;vector&gt;                                             &lt;br /&gt;#include &lt;fstream&gt;                                            &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;&lt;br /&gt;std::ifstream is;&lt;br /&gt;int DefaultByteOrder=ByteOrderMSB;&lt;br /&gt;int DefaultBitOrder=BitOrderMSB;&lt;br /&gt;MetadataKey ColorType;         &lt;br /&gt;MetadataKey Compression;       &lt;br /&gt;MetadataKey Filter;            &lt;br /&gt;MetadataKey Interlace;         &lt;br /&gt;MetadataKey height;            &lt;br /&gt;MetadataKey width;             &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;std::vector&lt;tag&gt; TagArray;&lt;br /&gt;is.open ("test.png", std::ifstream::in | std::ifstream::binary);&lt;br /&gt;if (is.good()) {                                             &lt;br /&gt;MetadataKey IHDR(is);                                        &lt;br /&gt;IHDR.setOffset(12);                                          &lt;br /&gt;IHDR.setSize(4);                                             &lt;br /&gt;if(!checkKey(IHDR,"IHDR")) return -1;                        &lt;br /&gt;width.setStream(is);                                         &lt;br /&gt;width.setBaseKey(IHDR);                                      &lt;br /&gt;width.setOffset(0);                                          &lt;br /&gt;width.setSize(4);                                            &lt;br /&gt;Tag t0;                                                      &lt;br /&gt;t0.setName("Width" );&lt;br /&gt;t0.setValue(width.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t0);&lt;br /&gt;height.setStream(is);&lt;br /&gt;height.setBaseKey(width);&lt;br /&gt;height.setOffset(0);&lt;br /&gt;height.setSize(4);&lt;br /&gt;Tag t1;&lt;br /&gt;t1.setName("Height" );&lt;br /&gt;t1.setValue(height.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t1);&lt;br /&gt;ColorType.setStream(is);&lt;br /&gt;ColorType.setBaseKey(height);&lt;br /&gt;ColorType.setOffset(0);&lt;br /&gt;ColorType.setSize(1);&lt;br /&gt;Tag t2;&lt;br /&gt;t2.setName("Color_type" );&lt;br /&gt;t2.setValue(ColorType.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t2);&lt;br /&gt;Compression.setStream(is);&lt;br /&gt;Compression.setBaseKey(ColorType);&lt;br /&gt;Compression.setOffset(0);&lt;br /&gt;Compression.setSize(1);&lt;br /&gt;Tag t3;&lt;br /&gt;t3.setName("Compression_method" );&lt;br /&gt;t3.setValue(Compression.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t3);&lt;br /&gt;Filter.setStream(is);&lt;br /&gt;Filter.setBaseKey(Compression);&lt;br /&gt;Filter.setOffset(0);&lt;br /&gt;Filter.setSize(1);&lt;br /&gt;Tag t4;&lt;br /&gt;t4.setName("Filter_method" );&lt;br /&gt;t4.setValue(Filter.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t4);&lt;br /&gt;Interlace.setStream(is);&lt;br /&gt;Interlace.setBaseKey(Filter);&lt;br /&gt;Interlace.setOffset(0);&lt;br /&gt;Interlace.setSize(1);&lt;br /&gt;Tag t5;&lt;br /&gt;t5.setName("Interlace_method" );&lt;br /&gt;t5.setValue(Interlace.getNumber(DefaultByteOrder));&lt;br /&gt;TagArray.push_back(t5);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-990708453628677153?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/990708453628677153/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/translator-description-of-png-file.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/990708453628677153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/990708453628677153'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/translator-description-of-png-file.html' title='Translator'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-2572743045746530083</id><published>2010-06-28T11:22:00.000-07:00</published><updated>2010-07-13T10:23:24.225-07:00</updated><title type='text'>Translator</title><content type='html'>&lt;p&gt;&lt;strong&gt;Description of mp3 file&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Binary ID3;&lt;br /&gt;&lt;br /&gt;ByteOrder=MSB;&lt;br /&gt;BitOrder=MSB;&lt;br /&gt;&lt;br /&gt;StartMetadataKey ID3(offset=0, size=3);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;checkKey(ID3)="ID3";&lt;br /&gt;&lt;br /&gt;MetadataKey HeaderFlag(start, offset=5, size=1);&lt;br /&gt;&lt;br /&gt;MetadataKey ID3_size(start, offset=6, size=4);&lt;br /&gt;&lt;br /&gt;MetadataSize=getNumber(ID3_size);&lt;br /&gt;&lt;br /&gt;if (getBit(HeaderFlag, 6)==1)&lt;br /&gt;{&lt;br /&gt;MetadataKey ExHeaderSize(start, offset=10, size=4);&lt;br /&gt;MetadataKey FirstFrameID(start, offset=getNumber(ExHeaderSize)+10, size=4);&lt;br /&gt;MetadataSize-=(10+getNumber(ExHeaderSize));&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;MetadataKey FirstFrameID(start, offset=10, size=4);&lt;br /&gt;&lt;br /&gt;key=FirstFrameID;&lt;br /&gt;while(MetadataSize&gt;0)&lt;br /&gt;{&lt;br /&gt;MetadataKey sizeOfTag(key, offset=0, size=4);&lt;br /&gt;if(getByte(key, 0)==0x00)&lt;br /&gt;{&lt;br /&gt;  break;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  TagSize=getNumber(sizeOfTag);&lt;br /&gt;  if(getValue(key)=="TALB" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    SetTag Album(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;  if(getValue(key)=="TCOM" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    setTag Composer(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;  if(getValue(key)=="TDAT" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    setTag Date(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;  if(getValue(key)=="TRCK" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    setTag Track_number(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;  if(getValue(key)=="TIT2" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    setTag Title(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;  if(getValue(key)=="TENC" &amp;amp;&amp;amp; (TagSize&gt;1))&lt;br /&gt;  {&lt;br /&gt;    MetadataKey encoding(key, offset=6, size=1);&lt;br /&gt;    setTag Encoded_by(getStringByLink(encoding, offset=0, size=getNumber(sizeOfTag)-1));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  MetadataSize-=(10+getNumber(sizeOfTag));&lt;br /&gt;  shift(key, 10+getNumber(sizeOfTag));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Is generated parser&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;#include "MetadataKey.h"&lt;br /&gt;#include "Tag.h"&lt;br /&gt;#include "MetadataFunc.h"&lt;br /&gt;#include &lt;vector&gt;&lt;br /&gt;#include &lt;fstream&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;&lt;br /&gt;std::ifstream is;&lt;br /&gt;int DefaultByteOrder=ByteOrderMSB;&lt;br /&gt;int DefaultBitOrder=BitOrderMSB;&lt;br /&gt;MetadataKey ExHeaderSize;&lt;br /&gt;MetadataKey FirstFrameID;&lt;br /&gt;MetadataKey HeaderFlag;&lt;br /&gt;MetadataKey ID3_size;&lt;br /&gt;int MetadataSize;&lt;br /&gt;int TagSize;&lt;br /&gt;MetadataKey encoding;&lt;br /&gt;MetadataKey key;&lt;br /&gt;MetadataKey sizeOfTag;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;std::vector&lt;tag&gt; TagArray;&lt;br /&gt;is.open ("test.mp3", std::ifstream::in | std::ifstream::binary);&lt;br /&gt;if (is.good()) {&lt;br /&gt;MetadataKey ID3(is);&lt;br /&gt;ID3.setOffset(0);&lt;br /&gt;ID3.setSize(3);&lt;br /&gt;if(!checkKey(ID3,"ID3")) return -1;&lt;br /&gt;HeaderFlag.setStream(is);&lt;br /&gt;HeaderFlag.setOffset(5);&lt;br /&gt;HeaderFlag.setSize(1);&lt;br /&gt;ID3_size.setStream(is);&lt;br /&gt;ID3_size.setOffset(6);&lt;br /&gt;ID3_size.setSize(4);&lt;br /&gt;MetadataSize=ID3_size.getNumber(DefaultByteOrder);&lt;br /&gt;&lt;br /&gt;if(HeaderFlag.getBit(6, DefaultBitOrder)==1){&lt;br /&gt;ExHeaderSize.setStream(is);&lt;br /&gt;ExHeaderSize.setOffset(10);&lt;br /&gt;ExHeaderSize.setSize(4);&lt;br /&gt;FirstFrameID.setStream(is);&lt;br /&gt;FirstFrameID.setOffset(ExHeaderSize.getNumber(DefaultByteOrder)+10);&lt;br /&gt;FirstFrameID.setSize(4);&lt;br /&gt;MetadataSize-=(10+ExHeaderSize.getNumber(DefaultByteOrder));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else{&lt;br /&gt;FirstFrameID.setStream(is);&lt;br /&gt;FirstFrameID.setOffset(10);&lt;br /&gt;FirstFrameID.setSize(4);&lt;br /&gt;}&lt;br /&gt;key=FirstFrameID;&lt;br /&gt;while(MetadataSize&gt;0){&lt;br /&gt;sizeOfTag.setStream(is);&lt;br /&gt;sizeOfTag.setBaseKey(key);&lt;br /&gt;sizeOfTag.setOffset(0);&lt;br /&gt;sizeOfTag.setSize(4);&lt;br /&gt;&lt;br /&gt;if(key.getByte(0)==0x00){&lt;br /&gt;break;}&lt;br /&gt;&lt;br /&gt;else{&lt;br /&gt;{&lt;br /&gt;TagSize=sizeOfTag.getNumber(DefaultByteOrder);&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TALB"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t0;&lt;br /&gt;t0.setName("Album" );&lt;br /&gt;t0.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TCOM"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t1;&lt;br /&gt;t1.setName("Composer" );&lt;br /&gt;t1.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TDAT"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t2;&lt;br /&gt;t2.setName("Date" );&lt;br /&gt;t2.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TRCK"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t3;&lt;br /&gt;t3.setName("Track_number" );&lt;br /&gt;t3.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t3);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TIT2"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t4;&lt;br /&gt;t4.setName("Title" );&lt;br /&gt;t4.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(key.getValue()=="TENC"&amp;amp;&amp;amp;(TagSize&gt;1)){&lt;br /&gt;encoding.setStream(is);&lt;br /&gt;encoding.setBaseKey(key);&lt;br /&gt;encoding.setOffset(6);&lt;br /&gt;encoding.setSize(1);&lt;br /&gt;Tag t5;&lt;br /&gt;t5.setName("Encoded_by" );&lt;br /&gt;t5.setValue(getStringByLink(encoding,0,sizeOfTag.getNumber(DefaultByteOrder)-1));&lt;br /&gt;TagArray.push_back(t5);&lt;br /&gt;}&lt;br /&gt;MetadataSize-=(10+sizeOfTag.getNumber(DefaultByteOrder));&lt;br /&gt;key.setOffset(10+sizeOfTag.getNumber(DefaultByteOrder)+key.getSize());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-2572743045746530083?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/2572743045746530083/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/translator-description-of-mp3-file-1.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2572743045746530083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2572743045746530083'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/translator-description-of-mp3-file-1.html' title='Translator'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-5094220359402446873</id><published>2010-06-18T03:21:00.000-07:00</published><updated>2010-07-13T10:26:37.075-07:00</updated><title type='text'>ID3 and Exif</title><content type='html'>&lt;p&gt;ID3&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;Section Name( Length=0, Offset=0,&lt;br /&gt;BeginMarker=0, EndMarker=0 )&lt;br /&gt;&lt;br /&gt;Offset= A   // Абсолютное смещение&lt;br /&gt;Offset= +A  // Смещение вперед&lt;br /&gt;Offset= -A  // Смещение назад&lt;br /&gt;&lt;br /&gt;-------------------------------------------------&lt;br /&gt;&lt;br /&gt;Read ( Length=0, Offset=0,&lt;br /&gt;BeginMarker=0, EndMarker=0 )&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Section ID3_Header( Offset=0, BeginMarker="ID3" )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;Version = Read(1);&lt;br /&gt;Revision = Read(1);&lt;br /&gt;Flags = Read(1);&lt;br /&gt;ID3Size = Read(4);&lt;br /&gt;&lt;br /&gt;if (Flags[6])&lt;br /&gt;{&lt;br /&gt;Section ID3_ExtHeader()&lt;br /&gt;{&lt;br /&gt; ExtSize = Read(4);&lt;br /&gt; ExtFlags = Read(2);&lt;br /&gt; SizeOfPadding = Read(4);&lt;br /&gt;}&lt;br /&gt;Skip(ExtSize);&lt;br /&gt;ID3Size -= (10+ExtSize);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Section Frames(Size=ID3Size)&lt;br /&gt;{&lt;br /&gt;for()&lt;br /&gt;{&lt;br /&gt;Section Frame_Header(Size=10)&lt;br /&gt;{&lt;br /&gt; Frame_ID = Read(4);&lt;br /&gt; Frame_Size = Read(4);&lt;br /&gt; Status = Read(1);&lt;br /&gt; Enc = Read(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Switch (Frame_ID)&lt;br /&gt;{&lt;br /&gt; case "UFID": Frame_UFID(Frame_Size);&lt;br /&gt; case "TIT2": Frame_TIT2(Frame_Size);&lt;br /&gt;&lt;br /&gt; default: Skip(Frame_Size);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function ReadID3String(Enc)&lt;br /&gt;{&lt;br /&gt;if (Enc==0x01) return ReadUnicodeString();&lt;br /&gt;else return ReadString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Unique file identifier&lt;br /&gt;function Frame_UFID(Frame_Size)&lt;br /&gt;{&lt;br /&gt;Section (Size=Frame_Size)&lt;br /&gt;{&lt;br /&gt;Owner_Identifier = ReadString();&lt;br /&gt;Identifier = Read( Frame_Size-SizeOf(Owner_Identifier) );&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//The 'Title/Songname/Content description' frame is the actual name of the piece (e.g. "Adagio", "Hurricane Donna").&lt;br /&gt;function Frame_TIT2(Frame_Size)&lt;br /&gt;{&lt;br /&gt;Section (Size=Frame_Size)&lt;br /&gt;{&lt;br /&gt;Text_Enc = Read(1);&lt;br /&gt;Title2 = ReadID3String(Text_Enc);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Exif&lt;/p&gt;&lt;p&gt;&lt;br /&gt;                                       &lt;br /&gt;/*&lt;br /&gt;Section Name( Length=0, Offset=0,&lt;br /&gt;BeginMarker=0, EndMarker=0 )&lt;br /&gt;&lt;br /&gt;Offset= A   // Абсолютное смещение&lt;br /&gt;Offset= +A  // Смещение вперед&lt;br /&gt;Offset= -A  // Смещение назад&lt;br /&gt;&lt;br /&gt;-------------------------------------------------&lt;br /&gt;&lt;br /&gt;Read ( Length=0, Offset=0,&lt;br /&gt;BeginMarker=0, EndMarker=0 )&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Section APP1( Offset=0x02, BeginMarker=0xFFE1 )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// APP1Length = Read(Length=2);&lt;br /&gt;&lt;br /&gt;APP1Length = Read(2);&lt;br /&gt;Identifier = Read(5);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Section APP1_Body(Offset=+1, Size=APP1Length-8)&lt;br /&gt;{&lt;br /&gt;ByteOrder   = Read(2);&lt;br /&gt;IFD0_Offset = Read(4, Offset=4);&lt;br /&gt;&lt;br /&gt;Section IFD0(Offset=IFD0_Offset)&lt;br /&gt;{&lt;br /&gt;NumberOfInteroperability = Read(2);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for(NumberOfInteroperability)&lt;br /&gt;{&lt;br /&gt; FillParam( Read(Param) );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;NextIFDOffset = Read(2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Section ExifIFD(Offset=ExifIFDPointer)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------&lt;br /&gt;&lt;br /&gt;structure Param&lt;br /&gt;{&lt;br /&gt;Tag(2),&lt;br /&gt;Type(2),&lt;br /&gt;Count(4),&lt;br /&gt;ValueOrOffset(4)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function GetValue(Param)&lt;br /&gt;{&lt;br /&gt;Switch(Param.Type)&lt;br /&gt;{&lt;br /&gt;case 0x0200: return ReadString(Offset=Param.ValueOrOffset);&lt;br /&gt;case 0x0500: return Read(8, Offset=Param.ValueOrOffset);&lt;br /&gt;case 0x0300: return Param.ValueOrOffset;&lt;br /&gt;case 0x0400: return Param.ValueOrOffset;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function FillParam(Param)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;switch (Param.Tag)&lt;br /&gt;{&lt;br /&gt;case 0x0E01: ImageDescription  = GetValue(Param);&lt;br /&gt;case 0x0F01: Make   = GetValue(Param);&lt;br /&gt;case 0x1001: Model   = GetValue(Param);&lt;br /&gt;case 0x1201: Orientation  = GetValue(Param);&lt;br /&gt;case 0x1A01: XResolution = GetValue(Param);&lt;br /&gt;case 0x1B01: YResolution  = GetValue(Param);&lt;br /&gt;case 0x2801: ResolutionUnit  = GetValue(Param);&lt;br /&gt;case 0x3201: DateTime   = GetValue(Param);&lt;br /&gt;case 0x1302: YCbCrPositioning  = GetValue(Param);&lt;br /&gt;case 0x9882: CopyRight   = GetValue(Param);&lt;br /&gt;case 0x6987: ExifIFDPointer  = GetValue(Param);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-5094220359402446873?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/5094220359402446873/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/id3-section-name-length0-offset0.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/5094220359402446873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/5094220359402446873'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/id3-section-name-length0-offset0.html' title='ID3 and Exif'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-769236417825336929</id><published>2010-06-10T11:38:00.000-07:00</published><updated>2010-07-13T10:24:25.498-07:00</updated><title type='text'>ID3</title><content type='html'>&lt;p class="MsoNormal"&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;Binary ID3;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;StartMetadataKey ID3(offset=0, size=3);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(ID3)!=”ID3”) exit;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKye HeaderFlag(start, offset=3, size=1);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MeatdataKey ID3_size(start, offset=6, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataSize=getValue(ID3_size);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(HeaderFlag)[6])&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey ExHeaderSize(start, offset=10, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey FirstFrameID(ExHeaderSize, offset=getValue(ExHeaderSize)+10, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataSize -=(10+getValue(ExHeaderSize));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;Else&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey FirstFrameID(start, offset=10, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;Key=FirstFrameID;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;While(MetadataSize&gt;0)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey size(key, offset=4, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;If(getValue(key)==”TALB”)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;MetadataKey encoding(key, offset=10, size=1);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;SetTag Album(getVakue(encoding) , getValueByLink(encoding, offset=1, size=getValue(size)-1));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(key)==”TCOM”)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;MetadataKey encoding(key, offset=10, size=1);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;SetTag Composer(getVakue(encoding) , getValueByLink(encoding, offset=1, size=getValue(size)-1));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;If(getValue(key)==”TDAT”)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;MetadataKey encoding(key, offset=10, size=1);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;SetTag Date(getVakue(encoding) , getValueByLink(encoding, offset=1, size=getValue(size)-1));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataSize -=(10+getValue(size));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey newKey(key, offset=10+geValue(size), size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;Key=newKey;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-769236417825336929?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/769236417825336929/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/binary-id3-startmetadatakey-id3offset0.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/769236417825336929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/769236417825336929'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/binary-id3-startmetadatakey-id3offset0.html' title='ID3'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8031017882989122084.post-2649005707821200393</id><published>2010-06-10T11:37:00.000-07:00</published><updated>2010-07-13T10:25:02.674-07:00</updated><title type='text'>Exif</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;Binary Exif;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;StartMetadataKey APP1_Marker(offset=2, size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(APP1_Marker)!=0xFFE1) exit;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey Length(APP1_Marker, offset=2, size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey APP1(APP1_Marker, offset=10, size=getValue(Length));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey IFD_Offset(APP1, offset=4, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey CountOfTag(APP1, offset-getValue(IDF_Offset), size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey FirstTagID(CountOfTag, offset=2, size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey TagID=FirstTagID;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;count=getValue(CountOgTag));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;While(coun&gt;0)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;MetadataKey Type(TagID, offset=2, size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;MetadataKey ValueOffset(TagID, offset=8, size=4);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x0E01)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200) &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;SetTag ImageDescription(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag ImageDescription(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag ImageDescription(0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x0F01)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag Make (0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag Make(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag Make (0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x1001)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag Model(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag Model(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag Model(0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x1201)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag Orientation(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag Orientation0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag Orientation(0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x1A01)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag XResolution(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag XResolution (0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag XResolution (0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x1B01)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag YResolution(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag YResolution (0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag YResolution (0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;If(getValue(TagID)==0x3201)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x200)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;SetTag DateTime(0x01, getValueByLink(TagID,offset=getValue(ValueOffset), key=00));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:2"&gt;                               &lt;/span&gt;If(getValue(Type)==0x500) SetTag DateTime (0x01, getValueByLink(TagID,offset=getValue(ValueOffset), size=8));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;if(tag.Type==0x0100 || tag.Type==0x0300 || tag.Type==0x0400)SetTag DateTime(0x01, getValue(ValueOffset));&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;count-=1;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;Metadatakey newTagID(TagID, offset=12, size=2);&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;TagID=newTadIG;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="mso-ansi-language:EN-US"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8031017882989122084-2649005707821200393?l=shante-gsoc2010.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shante-gsoc2010.blogspot.com/feeds/2649005707821200393/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/binary-exif-startmetadatakey.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2649005707821200393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8031017882989122084/posts/default/2649005707821200393'/><link rel='alternate' type='text/html' href='http://shante-gsoc2010.blogspot.com/2010/06/binary-exif-startmetadatakey.html' title='Exif'/><author><name>Shante</name><uri>http://www.blogger.com/profile/07467261405338705876</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_qffKi9eNTwo/S-HJQMPGcRI/AAAAAAAAAAM/LJ9RnoCguSs/S220/SA500026.jpg'/></author><thr:total>0</thr:total></entry></feed>
