| // Copyright (C) 2014 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Package vle implements binary.Reader and binary.Writer using a variable |
| // length encoding format. |
| // |
| // Boolean values are encoded as single bytes, where 0 represents false and non- |
| // zero represents true. |
| // |
| // 8 bit values are encoded as single bytes. |
| // 16, 32 and 64 bit unsigned integers are encoded into a one or more bytes. |
| // The number of sequential ones starting from the most-significant bit of the |
| // first encoded byte describe the number of additional bytes that make up the |
| // unsigned integer. If the run of ones does not fill the byte, then the run is |
| // terminated with a zero bit. The unsigned integer value is then big-endian |
| // encoded into the remainder of the bits from the first byte and any |
| // additional bytes. |
| // |
| // For example, the 16-bit number 0xABC would be encoded as follows: |
| // |
| // MSB LSB MSB LSB |
| // ╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗ ╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗ |
| // ║C₀ │C₁ │D₁₃│D₁₂│D₁₁│D₁₀│D₉ │D₈ ║ ║D₇ │D₆ │D₅ │D₄ │D₃ │D₂ │D₁ │D₀ ║ |
| // ║ │ │ │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ ║ |
| // ║ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 ║ ║ 1 │ 0 │ 1 │ 1 │ 1 │ 1 │ 0 │ 0 ║ |
| // ╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝ ╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝ |
| // Byte₀ Byte₁ |
| // |
| // C has a run of 1, meaning there is one extra byte of data. |
| // D holds the unsigned integer value 0xABC with bits 0000 1010 1011 1100. |
| // |
| // Signed integers are converted to unsigned integers by interleaving negative |
| // then positive numbers before being encoded as unsigned integers (as described |
| // above). For example the signed numbers [±0, -1, +1, -2, +2] are first |
| // transformed to the unsigned integers [0, 1, 2, 3, 4] before being encoded. |
| // This is done so that small negative and small positive numbers are encoded |
| // with fewer bytes. |
| // |
| // 32 bit floating-point numbers are first converted to a 32 bit unsigned |
| // integer using math.Float32bits and then byte-reversed before being encoded |
| // as a unsigned integer. |
| // |
| // 64 bit floating-point numbers are first converted to a 64 bit unsigned |
| // integer using math.Float64bits and then byte-reversed before being encoded |
| // as a unsigned integer. |
| // |
| // The bytes of floating-point numbers are reversed so that floating pointer |
| // numbers with simple fractional parts are encoded with fewer bytes, as |
| // these are considered the common case. |
| // |
| // String encodes a 32 bit unsigned integer representing the length of the |
| // string in bytes followed by the string data encoded in UTF-8: |
| // count uint32 // in bytes |
| // data0, data1, data2... byte // string in UTF-8 |
| // |
| package vle |