<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ebyte.org</title>
    <link>https://ebyte.org/</link>
    <description>Recent content on ebyte.org</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 20 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ebyte.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>EByte and Binary Schemas Explained in Plain Language</title>
      <link>https://ebyte.org/ebyte-and-binary-schemas-explained-in-plain-language/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-and-binary-schemas-explained-in-plain-language/</guid>
      <description>&lt;p&gt;A text file explains itself. Open a CSV or a JSON file and you can read it, more or less. A binary file doesn&amp;rsquo;t. Open one in a hex editor and you see rows of numbers like &lt;code&gt;45 42 01 02 01 41 00&lt;/code&gt;, and nothing tells you where one value stops and the next begins.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s because the meaning lives outside the file. Some program decided that the first two bytes are a magic number, the next byte is a version, the one after that counts how many records follow, and so on. The program knows. The file doesn&amp;rsquo;t. If you want to read that file in another program, you need a copy of that knowledge.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte and the Story of the Byte Behind the Name</title>
      <link>https://ebyte.org/ebyte-and-the-story-of-the-byte-behind-the-name/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-and-the-story-of-the-byte-behind-the-name/</guid>
      <description>&lt;p&gt;EByte is a tool that cares about bytes, every one of them, so the name starts there. The word itself is younger than most people guess, and its odd spelling was on purpose.&lt;/p&gt;&#xA;&lt;p&gt;First came the bit. The word is short for binary digit, and Claude Shannon put it in print in 1948 in his paper on the mathematics of communication, crediting John Tukey with it. A bit is a single 0 or 1. Useful, but too small to hold a letter or a number on its own.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Case Study Flipping and Editing a Real BMP Image</title>
      <link>https://ebyte.org/ebyte-case-study-flipping-and-editing-a-real-bmp-image/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-case-study-flipping-and-editing-a-real-bmp-image/</guid>
      <description>&lt;p&gt;BMP is about as plain as image formats get, which makes it a good test of whether a schema can describe a real file down to the last byte. This case study made a tiny bitmap with Python&amp;rsquo;s Pillow library, read it with the released &lt;code&gt;ebyte&lt;/code&gt; 0.1.1 binary, edited it four ways and broke it five ways. Every number below is what the tools printed.&lt;/p&gt;&#xA;&lt;p&gt;The image is 5 pixels wide and 3 tall: a red stripe on top, green in the middle, blue at the bottom. Pillow saved it as a 102-byte, 24-bit BMP. That&amp;rsquo;s a 14-byte file header, a 40-byte info header and 48 bytes of pixels. Five pixels at 3 bytes each make 15 bytes a row, and BMP pads every row to a multiple of 4, so each row carries one extra zero byte.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Case Study Inspecting and Editing a Real ZIP Archive</title>
      <link>https://ebyte.org/ebyte-case-study-inspecting-and-editing-a-real-zip-archive/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-case-study-inspecting-and-editing-a-real-zip-archive/</guid>
      <description>&lt;p&gt;A ZIP file is a good test of whether a schema can follow a real format&amp;rsquo;s bookkeeping. Every file inside it is described twice: once in a local header just before its data, and again in a central directory near the end. A short end record then says where that directory starts. This case study built a one-file ZIP with Python&amp;rsquo;s &lt;code&gt;zipfile&lt;/code&gt; module, read it with the released &lt;code&gt;ebyte&lt;/code&gt; 0.1.1 binary, edited it and then fed it archives it wasn&amp;rsquo;t built for.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Case Study Reading and Editing a Real WAV File</title>
      <link>https://ebyte.org/ebyte-case-study-reading-and-editing-a-real-wav-file/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-case-study-reading-and-editing-a-real-wav-file/</guid>
      <description>&lt;p&gt;The example that ships with EByte is a made-up format. This case study uses a real one: a WAV audio file, made by Python&amp;rsquo;s standard &lt;code&gt;wave&lt;/code&gt; module and read with the released &lt;code&gt;ebyte&lt;/code&gt; 0.1.0 binary, downloaded from GitHub like anyone else would get it. Everything below, every number and every error, is what that binary actually printed.&lt;/p&gt;&#xA;&lt;p&gt;The file is a tenth of a second of a 440 Hz tone, mono, 16-bit, 8,000 samples a second. That makes 1,644 bytes: a 44-byte header and 1,600 bytes of samples. The Linux archive&amp;rsquo;s checksum matched SHA256SUMS before anything ran.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Launches One Schema for Reading and Writing Binary Files</title>
      <link>https://ebyte.org/ebyte-launches-one-schema-for-reading-and-writing-binary-files/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-launches-one-schema-for-reading-and-writing-binary-files/</guid>
      <description>&lt;p&gt;EByte 0.1 is out. It&amp;rsquo;s a small Go library and a command-line tool for binary file formats, and it does one thing that sounds obvious until you&amp;rsquo;ve tried it: you describe a format once, and that single description reads files, writes them and explains them.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the usual situation it&amp;rsquo;s meant for. A device exports a file, or an old program saves one, and you need to look inside it, change a value and save it again. You end up writing a reader. Then a writer, which has to agree with the reader to the byte. Then, when a file won&amp;rsquo;t load, you open a hex editor and count bytes by hand to find out which field went wrong. That&amp;rsquo;s three descriptions of the same format, and they drift.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Testing Starts From Bytes Written Down Before the Code</title>
      <link>https://ebyte.org/ebyte-testing-starts-from-bytes-written-down-before-the-code/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-testing-starts-from-bytes-written-down-before-the-code/</guid>
      <description>&lt;p&gt;A codec has a sneaky way of passing its own tests. If the decoder and the encoder share a mistake, say both read a count from the wrong byte, then decoding a file and encoding it again still gives the original bytes back. The round trip looks perfect and the format is wrong. So EByte&amp;rsquo;s tests don&amp;rsquo;t start from the code. They start from bytes that were written down by hand before the decoder or encoder existed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>EByte Use Example Checking a Folder of Recordings in a Shell Script</title>
      <link>https://ebyte.org/ebyte-use-example-checking-a-folder-of-recordings-in-a-shell-script/</link>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/ebyte-use-example-checking-a-folder-of-recordings-in-a-shell-script/</guid>
      <description>&lt;p&gt;Most of the time nobody opens a binary file by hand. Files arrive from devices, uploads and exports, and something has to decide which ones are fine before anything else reads them. EByte&amp;rsquo;s exit codes and one-line diagnostics are built for that job, so this example puts the released &lt;code&gt;ebyte&lt;/code&gt; 0.1.1 binary in a short shell loop over a folder of audio recordings.&lt;/p&gt;&#xA;&lt;p&gt;The folder holds seven &lt;code&gt;.wav&lt;/code&gt; files of the kind a small sensor setup might collect overnight. Four are good recordings made with Python&amp;rsquo;s &lt;code&gt;wave&lt;/code&gt; module, at three different sample rates, one of them stereo. The other three are the usual trouble. One upload was cut off at 5,000 bytes, one file is a text log someone saved with a &lt;code&gt;.wav&lt;/code&gt; name, and one has four extra bytes after the audio where a recorder started writing a metadata chunk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://ebyte.org/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/about/</guid>
      <description>&lt;p&gt;ebyte.org is the home of EByte, a small engine for binary file formats. You describe a format once, in a JSON schema: which fields come first, how wide each one is, which byte order, how many records follow. EByte then uses that one description three ways. It reads a file into JSON you can edit, it writes edited JSON back into a binary file, and it traces a file field by field, so when something doesn&amp;rsquo;t match you get the field, the byte offset and what was expected.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Command Reference</title>
      <link>https://ebyte.org/command-reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/command-reference/</guid>
      <description>&lt;p&gt;&lt;code&gt;ebyte&lt;/code&gt; has four commands. They all use the same interpreter as the Go library, and they never guess a format: every command needs a schema. The full reference is &lt;a href=&#34;https://github.com/softdevstudio/ebyte/blob/main/docs/cli.md&#34;&gt;cli.md on GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebyte validate-schema --schema format.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebyte decode  --schema format.json --input file.bin  --output file.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebyte encode  --schema format.json --input file.json --output new.bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebyte inspect --schema format.json --input file.bin  --format text&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;commands&#34;&gt;Commands&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;validate-schema&lt;/code&gt;&lt;/strong&gt; checks a schema and prints its name and SHA-256 identity as JSON. It doesn&amp;rsquo;t read any binary input.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact</title>
      <link>https://ebyte.org/contact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/contact/</guid>
      <description>&lt;p&gt;ebyte.org would like to hear from:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone trying EByte out.&lt;/strong&gt; Which format you pointed it at, what worked, and what got in the way.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone who found a bug.&lt;/strong&gt; A file that didn&amp;rsquo;t come back byte for byte, an offset that looked wrong, an error you didn&amp;rsquo;t expect.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Anyone with a format EByte can&amp;rsquo;t describe yet.&lt;/strong&gt; Bit fields, floats, offsets, checksums: knowing which ones people need decides what comes next.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Write to &lt;strong&gt;&lt;a href=&#34;mailto:info@ebyte.org&#34;&gt;info@ebyte.org&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Download EByte</title>
      <link>https://ebyte.org/download/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/download/</guid>
      <description>&lt;p&gt;The &lt;code&gt;ebyte&lt;/code&gt; command is one file with nothing else to install. Each archive below holds it along with a short quick start, the example format, the manual and the license files. The links always point to the latest release.&lt;/p&gt;&#xA;&lt;div style=&#34;overflow-x:auto&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;System&lt;/th&gt;&#xA;          &lt;th&gt;Download&lt;/th&gt;&#xA;          &lt;th&gt;Checked before release&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/ebyte-linux-amd64.tar.gz&#34;&gt;ebyte-linux-amd64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Run on Linux&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Linux, ARM64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/ebyte-linux-arm64.tar.gz&#34;&gt;ebyte-linux-arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cross-built&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Apple silicon&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/ebyte-darwin-arm64.tar.gz&#34;&gt;ebyte-darwin-arm64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Run on macOS&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS, Intel&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/ebyte-darwin-amd64.tar.gz&#34;&gt;ebyte-darwin-amd64.tar.gz&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cross-built&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Windows, x86-64&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/ebyte-windows-amd64.zip&#34;&gt;ebyte-windows-amd64.zip&lt;/a&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Run on Windows&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;em&gt;Checksums are in &lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/SHA256SUMS&#34;&gt;SHA256SUMS&lt;/a&gt;. &lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases/latest/download/RELEASE-MANIFEST.json&#34;&gt;RELEASE-MANIFEST.json&lt;/a&gt; records the source commit, the Go version that built each binary and how each archive was checked. Every release is listed on &lt;a href=&#34;https://github.com/softdevstudio/ebyte/releases&#34;&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Start</title>
      <link>https://ebyte.org/quick-start/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/quick-start/</guid>
      <description>&lt;p&gt;EByte reads a binary file through a schema you write, turns it into JSON you can edit, and writes it back. This page goes from download to your first round trip in a few minutes, using the example that ships in every archive.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-get-the-tool&#34;&gt;1. Get the Tool&lt;/h2&gt;&#xA;&lt;p&gt;Download the archive for your system from the &lt;a href=&#34;https://ebyte.org/download/&#34;&gt;download page&lt;/a&gt; and unpack it. On Linux or macOS:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xzf ebyte-linux-amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ebyte&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./ebyte --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That prints the version, such as &lt;code&gt;ebyte 0.1.1&lt;/code&gt;. The folder also holds &lt;code&gt;examples/&lt;/code&gt;, the manual and the license files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Schema Reference</title>
      <link>https://ebyte.org/schema-reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ebyte.org/schema-reference/</guid>
      <description>&lt;p&gt;A schema tells EByte what a binary format looks like: the fields in order, how wide each one is, and how they depend on each other. This page covers version 1 of the schema format, the one EByte 0.1 reads. The full contract, with every edge case, is &lt;a href=&#34;https://github.com/softdevstudio/ebyte/blob/main/docs/schema-v1.md&#34;&gt;schema-v1.md on GitHub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-file&#34;&gt;The File&lt;/h2&gt;&#xA;&lt;p&gt;A schema is a UTF-8 JSON file with exactly four members:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;schema_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ebyte_packet&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;endian&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;little&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fields&amp;#34;&lt;/span&gt;: [ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt; ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;endian&lt;/code&gt; is &lt;code&gt;little&lt;/code&gt; or &lt;code&gt;big&lt;/code&gt;, and integers inherit it unless they set their own. Names are ASCII letters, digits and underscores, up to 64 characters, starting with a letter or underscore. EByte is strict about the JSON: unknown members, duplicate members, &lt;code&gt;null&lt;/code&gt; values and invalid Unicode are all rejected before any binary input is opened.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
