{"id":134,"date":"2012-11-08T13:34:49","date_gmt":"2012-11-08T13:34:49","guid":{"rendered":"http:\/\/exponentialdecay.co.uk\/blog\/?p=134"},"modified":"2025-12-01T16:59:57","modified_gmt":"2025-12-01T16:59:57","slug":"genesis-of-a-file-format","status":"publish","type":"post","link":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/","title":{"rendered":"Genesis of a File Format"},"content":{"rendered":"<p>Working from the bottom up and ignoring formal preservation descriptions of a file format (see: <a title=\"The National Archives Labs: PRONOM Vocabulary Specification (Draft)\" href=\"https:\/\/web.archive.org\/web\/20120201101101\/http:\/\/test.linkeddatapronom.nationalarchives.gov.uk\/vocabulary\/pronom-vocabulary.htm\" target=\"_blank\" rel=\"noopener noreferrer\">File Format\u00a0a\u00a0rdfs:Class<\/a>) &#8211; a file format represents a place to store information outside of a software application. It mirrors internal memory but promotes the use of the same data outside of, and in between applications.<\/p>\n<p>Formats can be taken for granted. As a software developer I will have written a number of my own in the past; usually adopting a <em>de-facto<\/em> standard mirroring the data structures used by the software application, \u00a0(as discussed in part in a previous\u00a0<a title=\"The National Archives Blog: CAFED00Ds and CAFEBABEs\" href=\"http:\/\/blog.nationalarchives.gov.uk\/blog\/cafed00ds-and-cafebabes\/\" target=\"_blank\" rel=\"noopener noreferrer\">blog<\/a>\u00a0for The National Archives), to be loaded back into memory to be acted upon at a later date.<\/p>\n<p>To explore the concept of the file format in more detail and to understand it\u00a0from genesis, or, &#8216;<em>creation<\/em>\u00a0to preservation&#8217;, this blog entry goes through the process of creating a new file format. It looks at some of the considerations which can be made to make it <em>robust<\/em> and hopefully make it suitable for preservation. It <em>asks the question<\/em> of readers &#8211; what other considerations do you think I could have made in creating this format which might make it <em>more amenable<\/em> to future preservation.<\/p>\n<p><strong>In the beginning&#8230;<\/strong><\/p>\n<p>Having recently attended an eye examination I decided a reasonable format to create would be one that stores the results of the prescription ordered by the optician. If \u00a0we look at the sample document below we can see that its structure may lend itself to being encoded in a formal specification:<\/p>\n<figure id=\"attachment_218\" aria-describedby=\"caption-attachment-218\" style=\"width: 672px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/eye-prescription\/\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-218 \" title=\"Glasses Prescription\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription.jpg\" alt=\"\" width=\"672\" height=\"422\" srcset=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription.jpg 1120w, https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription-500x314.jpg 500w, https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription-1024x643.jpg 1024w, https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription-768x483.jpg 768w, https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription-300x188.jpg 300w, https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/11\/eye-prescription-110x70.jpg 110w\" sizes=\"auto, (max-width: 672px) 100vw, 672px\" \/><\/a><figcaption id=\"caption-attachment-218\" class=\"wp-caption-text\">Sample glasses prescription from a recent examination: October 2012<\/figcaption><\/figure>\n<p>Coding this information into a format specification will allow me to create files that opticians can use to store patient data, read it back in future and render it in various output formats such as the one that created prescription document above.<\/p>\n<p><strong>Dissecting our data<\/strong><\/p>\n<p>Taking the complete document we can separate it into structured fields and data types. Without going into the full detail regarding the data type choices, the specification for the first version of my format is described below.<\/p>\n<pre>Eyeglass Format Specification 1.0\r\n---\r\nMagic number    - 14 bytes  - String\r\nVersion         - 1 bytes   - Unsigned Char\r\nBig-endian      - 1 byte    - Bool\r\nDate\/time       - 19 bytes  - String #YYYY-MM-DDTHH:MM:SS\r\nExpansion room  - 88 bytes  - Undefined\r\nSphere          - 8 bytes   - R: Float   L: Float\r\nCylinder        - 8 bytes   - R: Float   L: Float\r\nAxis            - 8 bytes   - R: Integer L: Integer\r\nPrism           - 8 bytes   - R: Float   L: Float\r\nBase            - 8 bytes   - R: Float   L: Float\r\nDistance acuity - 8 bytes   - R: Float   L: Float\r\nNear acuity     - 8 bytes   - R: Integer L: Integer\r\nPurpose         - 140 bytes - String\r\nObservation     - 255 bytes - String\r\nNext checkup    - 4 bytes   - Float\r\nEnd of file     - 4 bytes   - String<\/pre>\n<p>At this point I should state that the formal realization of this work is maintained in a <a title=\"GitHub: Eyeglass\" href=\"https:\/\/github.com\/ross-spencer\/eyeglass\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub repository<\/a> dedicated to the project. More information about eye prescriptions can be found on <a title=\"Wikipedia.org: Eyeglass Prescription\" href=\"http:\/\/en.wikipedia.org\/wiki\/Eyeglass_prescription\" target=\"_blank\" rel=\"noopener noreferrer\">Wikipedia<\/a>, and also in the main <em><a title=\"GitHub: eyeglass.py\" href=\"https:\/\/github.com\/ross-spencer\/eyeglass\/blob\/master\/eyeglass.py\" target=\"_blank\" rel=\"noopener noreferrer\">eyeglass<\/a>\u00a0<\/em>class implementing the specification described above.<\/p>\n<p>The numerical data types selected for the specification were constraints set by the prescription itself. They are either integer or float data types and simply need to encode values up to the correct magnitude. Other points of features of interest are described below:<\/p>\n<p><strong>Magic number (BOF) \/ End of file (EOF)<\/strong><\/p>\n<p>The &#8216;magic number&#8217; identifying the file format will be as follows:<\/p>\n<pre>'\\xBB\\x0D\\x0A\\x65\\x79\\x65\\x67\\x6C\\x61\\x73\\x73\\x1A\\x0A\\xAB'<\/pre>\n<p>The &#8216;end of file&#8217; sequence terminating the stream will be as follows:<\/p>\n<pre>'\\xBB\\x65\\x6f\\x66'<\/pre>\n<p>EOF and BOF sequences were selected in concert as I feel the existence of both can aid in the unambiguous identification of a file format by tools such as DROID.<\/p>\n<p>The design of the BOF sequence is based on elements described in the JPEG2000 specification (ISO\/IEC 15444-1)\u00a0and the <a title=\"PNG Specification: Rationale\" href=\"http:\/\/www.w3.org\/TR\/PNG-Rationale.html\" target=\"_blank\" rel=\"noopener noreferrer\">Portable Network Graphics Rationale<\/a>\u00a0document\u00a0<em>(12.11. PNG file signature)<\/em>:<\/p>\n<blockquote><p>The type of the JPEG 2000 Signature box shall be &#8216;jP\\040\\040&#8217; (0x6A502020). The length of this box shall be 12 bytes. The contents of this box shall be the 4-byte character string &#8216;&lt;CR&gt;&lt;LF&gt;&lt;0x87&gt;&lt;LF&gt;&#8217; (0x0D0A870A). For file verification purposes, this box can be considered a fixed-length 12-byte string which shall have the value<strong>:\u00a0<\/strong>0x0000 000C 6A50 2020 0D0A 870A.<strong>\u00a0<\/strong>The combination of the particular type and contents for this box <strong><em>enable an application to detect a<\/em><\/strong> <strong><em>common set of file transmission errors<\/em><\/strong>. The CR-LF sequence in the contents catches bad file transfers that alter newline sequences. The final linefeed checks for the inverse of the CR-LF translation problem. The third character of the box contents has its high-bit set to catch bad file transfers that clear bit 7.<\/p><\/blockquote>\n<p>And:<\/p>\n<blockquote><p><strong>&#8216;\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a&#8217; <\/strong><\/p>\n<p>This signature both identifies the file as a PNG file and <strong><em>provides for immediate detection of common file-transfer problems<\/em><\/strong>. The first two bytes distinguish PNG files on systems that expect the first two bytes to identify the file type uniquely. The first byte is chosen as a non-ASCII value to reduce the probability that a text file may be misrecognized as a PNG file; also, it catches bad file transfers that clear bit 7. Bytes two through four name the format. The CR-LF sequence catches bad file transfers that alter newline sequences. <strong>The control-Z character stops file display under MS-DOS.<\/strong> The final line feed checks for the inverse of the CR-LF translation problem.<\/p><\/blockquote>\n<p>The eyeglass format adopts features including a non-ASCII value at the beginning of the signature, this byte has its high-bit set to catch bad file transfers that clear bit 7. The signature also adopts additional elements of both signatures described above which help detect file-transfer problems. It also contains the ctrl-zcharacter (0x1A) to prevent the display of the file in MS-DOS.<\/p>\n<p>The EOF sequence simply consists of the same starting character as the BOF sequence followed by the ASCII characters <em>&#8216;eof&#8217;<\/em>.<\/p>\n<p><strong>Big-endian flag<\/strong><\/p>\n<p>The big-endian flag exists for the purpose of experimentation and to highlight the difference between formats, and their interpretation when encoded either as big-endian or little-endian.<\/p>\n<p><strong>Expansion room<\/strong><\/p>\n<p>As a developer I am torn between removing redundancy from my format and ensuring that it is as future-proofed as much as realistically possible. Redundancy affects the maintenance of code and file sizes and I never really want to transmit or store more data than absolutely necessary. Redundancy introduces costs that I don&#8217;t need to introduce, however, if a customer comes to me in a couple of weeks with a new requirement or the specification I have been working from (in this case the nature of eye glass prescriptions) changes, I need to be able to incorporate those changes flexibly.<\/p>\n<p>88 bytes is the equivalent of 22&#215;4-bytes worth of data. This may store 22 float values or integers or indeed any other data type. The expansion room is free to be used at any point by any <em>amount<\/em> or <em>type of data<\/em> formally specified. It ensures future file sizes remain consistent (582 bytes) and may be the least destructive way of adding information while pointers to existing data remain consistent.<\/p>\n<p>PNG describes a <a title=\"Portable Network Graphics: Chunk Naming Conventions\" href=\"http:\/\/www.w3.org\/TR\/PNG-Rationale.html#R.Chunk-naming-conventions\" target=\"_blank\" rel=\"noopener noreferrer\">different approach<\/a> to format extensions. Other formats may adopt different mechanisms too. I&#8217;ve simply adopted a method familiar to my previous development background in C++. I may use future blog posts to explore the relative merits of various format expansion mechanisms.<\/p>\n<p><strong>Additional notes<\/strong><\/p>\n<p>Features I&#8217;ve avoided in the format\u00a0specification\u00a0include separator characters between fields. Given the rigidity of my file and that it mandates the existence of each field I expect to be able to do some rudimentary checking on the validity of the file before reading it into memory in one operation. Responsibility for the accuracy and validity of values encoded in the format are left up to creating and rendering applications.<\/p>\n<p><strong>And there was light&#8230;<\/strong><\/p>\n<p>There&#8217;s our file format!\u00a0As mentioned above this work exists in a <a title=\"GitHub: eyeglass\" href=\"https:\/\/github.com\/ross-spencer\/eyeglass\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub project<\/a> entitled\u00a0<strong>&#8216;eyeglass&#8217;\u00a0<\/strong>and it will be added to as the blog evolves to study this format in more detail. Specific files of interest are the <a title=\"GitHub.com: Eyeglass class\" href=\"https:\/\/github.com\/ross-spencer\/eyeglass\/blob\/master\/eyeglass.py\" target=\"_blank\" rel=\"noopener noreferrer\">eyeglass<\/a> class which describes constructors for building the structured output which we are calling the <em>eyeglass <\/em>file format<em>\u00a0<\/em>and various methods for adding data and saving the digital objects.<\/p>\n<p>The other file of interest is an <a title=\"GitHub: Eyeglass Default Application\" href=\"https:\/\/github.com\/ross-spencer\/eyeglass\/blob\/master\/eyeglass_default.py\" target=\"_blank\" rel=\"noopener noreferrer\">application<\/a> which builds three of these objects. The first file created is the object put into memory using just the default constructor. The second and third objects are big- and little-endian representations of a sample prescription denoted by the naming suffixes<em> &#8216;-be&#8217;<\/em> and <em>&#8216;-le&#8217;<\/em> respectively.<\/p>\n<p>All three generated files are in the repository and have been given the <strong><em>.eygl\u00a0<\/em><\/strong>file extension for those who are unable to run the scripts but are interested in looking at the output.<\/p>\n<p><strong>After all that&#8230; Where next?\u00a0<\/strong><\/p>\n<p>In dissecting this work to create this blog entry I&#8217;ve already spotted that I may need to extend the format to include a &#8216;patient identifier&#8217;. This will be more effective than file naming conventions, however, I will need to understand what format this should take. Further, while my float values necessarily are four-bytes long, I believe 2-byte shorts (255 possible values) will be enough to store values for axis and near field acuity &#8211; the implications of changing these data types to create a smaller file size will need to be considered.<\/p>\n<p>Time and resource permitting, future blog posts will use this work to explore the identification and validation of this file format among other digital preservation concerns such as <em>rendering<\/em> and definition of &#8216;<em>the record<\/em>&#8216;.<\/p>\n<p>For now, my question to anyone who has read this far is: &#8216;<em><strong>In designing this format what other considerations could I have made to make it more suitable for future preservation?&#8217;\u00a0<\/strong><\/em>Given that this work potentially mirrors the initial processes and thinking of the software applications and file formats we are dealing with today and have to continue dealing with long into the future, what could we get\u00a0<em><strong>more right\u00a0<\/strong><\/em>at this point in time to make formats easier to handle 20 years down the line?\u00a0&#8230;Answers (and any other comments) on a postcard, in the comments below or on indeed on <a title=\"Twitter: @beet_keeper\" href=\"https:\/\/twitter.com\/beet_keeper\" target=\"_blank\" rel=\"noopener noreferrer\">twitter<\/a>, thank you!<\/p>\n<p><strong>[Update 2016-05-30]:\u00a0<\/strong>A nice summary of the format can be found on the ArchiveTeam.org Just Solve It: File Formats wiki:\u00a0<a href=\"http:\/\/fileformats.archiveteam.org\/wiki\/Eyeglass_file_format_(Ross_Spencer)\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/fileformats.archiveteam.org\/wiki\/Eyeglass_file_format_(Ross_Spencer)<\/a><\/p>\n<p><strong>[Update: 2019-10-13]:\u00a0<\/strong>A similar blog was written by Andy McFadden in 2005. It&#8217;s well worth a read: <a href=\"https:\/\/www.fadden.com\/tech\/file-formats.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.fadden.com\/tech\/file-formats.html<\/a><\/p>\n<p><em>For those who enjoyed this blog the first time around, a long delayed follow-up was published back in <a href=\"https:\/\/exponentialdecay.co.uk\/blog\/shattering-the-eyeglass\/\" target=\"_blank\" rel=\"noopener\">October 2023.<\/a>. Let me know if you like it!\u00a0<\/em><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_134\" class=\"pvc_stats total_only  \" data-element-id=\"134\" style=\"\"><i class=\"pvc-stats-icon small\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<div class=\"entry-summary\">\nWorking from the bottom up and ignoring formal preservation descriptions of a file format (see: File Format\u00a0a\u00a0rdfs:Class) &#8211; a file&hellip;\n<\/div>\n<div class=\"link-more\"><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Genesis of a File Format&rdquo;<\/span>&hellip;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_134\" class=\"pvc_stats total_only  \" data-element-id=\"134\" style=\"\"><i class=\"pvc-stats-icon small\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":206,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[3,19],"tags":[71,30,31,29,18,72,373],"class_list":["post-134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-preservation","category-python","tag-digital-preservation","tag-eyeglass","tag-eygl","tag-file-format","tag-programming","tag-python","tag-yyyy","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog\" \/>\n<meta property=\"og:description\" content=\"Working from the bottom up and ignoring formal preservation descriptions of a file format (see: File Format\u00a0a\u00a0rdfs:Class) &#8211; a file&hellip; Continue reading &ldquo;Genesis of a File Format&rdquo;&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/\" \/>\n<meta property=\"og:site_name\" content=\"ross spencer :: exponentialdecay.digipres :: blog\" \/>\n<meta property=\"article:published_time\" content=\"2012-11-08T13:34:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-01T16:59:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1276\" \/>\n\t<meta property=\"og:image:height\" content=\"744\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ross Spencer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@beet_keeper\" \/>\n<meta name=\"twitter:site\" content=\"@beet_keeper\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ross Spencer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/\"},\"author\":{\"name\":\"Ross Spencer\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"headline\":\"Genesis of a File Format\",\"datePublished\":\"2012-11-08T13:34:49+00:00\",\"dateModified\":\"2025-12-01T16:59:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/\"},\"wordCount\":1673,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"image\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eyeglass-spec-1.0.png\",\"keywords\":[\"Digital Preservation\",\"eyeglass\",\"eygl\",\"File Format\",\"Programming\",\"Python\",\"YYYY\"],\"articleSection\":[\"Digital Preservation\",\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/\",\"name\":\"Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eyeglass-spec-1.0.png\",\"datePublished\":\"2012-11-08T13:34:49+00:00\",\"dateModified\":\"2025-12-01T16:59:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#primaryimage\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eyeglass-spec-1.0.png\",\"contentUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eyeglass-spec-1.0.png\",\"width\":1276,\"height\":744,\"caption\":\"Eyeglass Format Box Diagram\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/genesis-of-a-file-format\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Genesis of a File Format\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/\",\"name\":\"ross spencer :: exponentialdecay.digipres :: blog\",\"description\":\"Digital preservation analyst, researcher, and software developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\",\"name\":\"Ross Spencer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"contentUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"width\":2560,\"height\":2560,\"caption\":\"Ross Spencer\"},\"logo\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\"},\"description\":\"Digital preservation domain expert and full-stack software developer.\",\"sameAs\":[\"http:\\\/\\\/www.exponentialdecay.co.uk\\\/blog\",\"https:\\\/\\\/www.instagram.com\\\/b33tk33p3r\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/ross-spencer-b6b9b758\\\/\",\"https:\\\/\\\/x.com\\\/beet_keeper\"],\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/author\\\/exponentialdecay\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/","og_locale":"en_US","og_type":"article","og_title":"Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog","og_description":"Working from the bottom up and ignoring formal preservation descriptions of a file format (see: File Format\u00a0a\u00a0rdfs:Class) &#8211; a file&hellip; Continue reading &ldquo;Genesis of a File Format&rdquo;&hellip;","og_url":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/","og_site_name":"ross spencer :: exponentialdecay.digipres :: blog","article_published_time":"2012-11-08T13:34:49+00:00","article_modified_time":"2025-12-01T16:59:57+00:00","og_image":[{"width":1276,"height":744,"url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png","type":"image\/png"}],"author":"Ross Spencer","twitter_card":"summary_large_image","twitter_creator":"@beet_keeper","twitter_site":"@beet_keeper","twitter_misc":{"Written by":"Ross Spencer","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#article","isPartOf":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/"},"author":{"name":"Ross Spencer","@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"headline":"Genesis of a File Format","datePublished":"2012-11-08T13:34:49+00:00","dateModified":"2025-12-01T16:59:57+00:00","mainEntityOfPage":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/"},"wordCount":1673,"commentCount":2,"publisher":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"image":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#primaryimage"},"thumbnailUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png","keywords":["Digital Preservation","eyeglass","eygl","File Format","Programming","Python","YYYY"],"articleSection":["Digital Preservation","Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/","url":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/","name":"Genesis of a File Format - ross spencer :: exponentialdecay.digipres :: blog","isPartOf":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#primaryimage"},"image":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#primaryimage"},"thumbnailUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png","datePublished":"2012-11-08T13:34:49+00:00","dateModified":"2025-12-01T16:59:57+00:00","breadcrumb":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#primaryimage","url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png","contentUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2012\/10\/eyeglass-spec-1.0.png","width":1276,"height":744,"caption":"Eyeglass Format Box Diagram"},{"@type":"BreadcrumbList","@id":"https:\/\/exponentialdecay.co.uk\/blog\/genesis-of-a-file-format\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/exponentialdecay.co.uk\/blog\/"},{"@type":"ListItem","position":2,"name":"Genesis of a File Format"}]},{"@type":"WebSite","@id":"https:\/\/exponentialdecay.co.uk\/blog\/#website","url":"https:\/\/exponentialdecay.co.uk\/blog\/","name":"ross spencer :: exponentialdecay.digipres :: blog","description":"Digital preservation analyst, researcher, and software developer","publisher":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/exponentialdecay.co.uk\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716","name":"Ross Spencer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","contentUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","width":2560,"height":2560,"caption":"Ross Spencer"},"logo":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png"},"description":"Digital preservation domain expert and full-stack software developer.","sameAs":["http:\/\/www.exponentialdecay.co.uk\/blog","https:\/\/www.instagram.com\/b33tk33p3r\/","https:\/\/www.linkedin.com\/in\/ross-spencer-b6b9b758\/","https:\/\/x.com\/beet_keeper"],"url":"https:\/\/exponentialdecay.co.uk\/blog\/author\/exponentialdecay\/"}]}},"views":11765,"_links":{"self":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":66,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/134\/revisions"}],"predecessor-version":[{"id":1590,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/134\/revisions\/1590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/media\/206"}],"wp:attachment":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}