@binary

The @binary module provides functions for encoding and decoding numeric types to and from byte arrays, with support for both little-endian and big-endian byte ordering.

Import

import @binary

Return Pattern

All functions return a tuple (result, error):

  • On success: (value, nil)
  • On failure: (nil, Error{message, code})
temp data, err = binary.encode_u32_to_little_endian(42)
if err != nil {
    panic(err.message)
}

8-bit Encoding

8-bit values have no endianness, so these functions work without endian suffixes.

encode_i8()

(i8) -> ([byte], Error)

Encodes a signed 8-bit integer to a single byte.

import @binary

do encode_signed_byte() {
    temp data, err = binary.encode_i8(-128)
    // data is a 1-byte array
}

decode_i8()

([byte]) -> (i8, Error)

Decodes a single byte to a signed 8-bit integer.

import @binary

do decode_signed_byte() {
    temp value, err = binary.decode_i8(data)
    // value is an i8
}

encode_u8()

(u8) -> ([byte], Error)

Encodes an unsigned 8-bit integer to a single byte.

import @binary

do encode_unsigned_byte() {
    temp data, err = binary.encode_u8(255)
    // data is a 1-byte array
}

decode_u8()

([byte]) -> (u8, Error)

Decodes a single byte to an unsigned 8-bit integer.

import @binary

do decode_unsigned_byte() {
    temp value, err = binary.decode_u8(data)
    // value is a u8
}

16-bit Encoding

Little Endian

encode_i16_to_little_endian()

(i16) -> ([byte], Error)

Encodes a signed 16-bit integer to 2 bytes in little-endian order.

import @binary

do encode_i16_le() {
    temp data, err = binary.encode_i16_to_little_endian(1000)
    // data is [0xE8, 0x03] (least significant byte first)
}

decode_i16_from_little_endian()

([byte]) -> (i16, Error)

Decodes 2 bytes in little-endian order to a signed 16-bit integer.


encode_u16_to_little_endian()

(u16) -> ([byte], Error)

Encodes an unsigned 16-bit integer to 2 bytes in little-endian order.


decode_u16_from_little_endian()

([byte]) -> (u16, Error)

Decodes 2 bytes in little-endian order to an unsigned 16-bit integer.


Big Endian

encode_i16_to_big_endian()

(i16) -> ([byte], Error)

Encodes a signed 16-bit integer to 2 bytes in big-endian order.

import @binary

do encode_i16_be() {
    temp data, err = binary.encode_i16_to_big_endian(1000)
    // data is [0x03, 0xE8] (most significant byte first)
}

decode_i16_from_big_endian()

([byte]) -> (i16, Error)

Decodes 2 bytes in big-endian order to a signed 16-bit integer.


encode_u16_to_big_endian()

(u16) -> ([byte], Error)

Encodes an unsigned 16-bit integer to 2 bytes in big-endian order.


decode_u16_from_big_endian()

([byte]) -> (u16, Error)

Decodes 2 bytes in big-endian order to an unsigned 16-bit integer.


32-bit Encoding

Little Endian

encode_i32_to_little_endian()

(i32) -> ([byte], Error)

Encodes a signed 32-bit integer to 4 bytes in little-endian order.


decode_i32_from_little_endian()

([byte]) -> (i32, Error)

Decodes 4 bytes in little-endian order to a signed 32-bit integer.


encode_u32_to_little_endian()

(u32) -> ([byte], Error)

Encodes an unsigned 32-bit integer to 4 bytes in little-endian order.

import @binary

do encode_u32_le() {
    temp data, err = binary.encode_u32_to_little_endian(305419896)
    // data is [0x78, 0x56, 0x34, 0x12]
}

decode_u32_from_little_endian()

([byte]) -> (u32, Error)

Decodes 4 bytes in little-endian order to an unsigned 32-bit integer.


Big Endian

encode_i32_to_big_endian()

(i32) -> ([byte], Error)

Encodes a signed 32-bit integer to 4 bytes in big-endian order.


decode_i32_from_big_endian()

([byte]) -> (i32, Error)

Decodes 4 bytes in big-endian order to a signed 32-bit integer.


encode_u32_to_big_endian()

(u32) -> ([byte], Error)

Encodes an unsigned 32-bit integer to 4 bytes in big-endian order.


decode_u32_from_big_endian()

([byte]) -> (u32, Error)

Decodes 4 bytes in big-endian order to an unsigned 32-bit integer.


64-bit Encoding

Little Endian

encode_i64_to_little_endian()

(i64) -> ([byte], Error)

Encodes a signed 64-bit integer to 8 bytes in little-endian order.


decode_i64_from_little_endian()

([byte]) -> (i64, Error)

Decodes 8 bytes in little-endian order to a signed 64-bit integer.


encode_u64_to_little_endian()

(u64) -> ([byte], Error)

Encodes an unsigned 64-bit integer to 8 bytes in little-endian order.


decode_u64_from_little_endian()

([byte]) -> (u64, Error)

Decodes 8 bytes in little-endian order to an unsigned 64-bit integer.


Big Endian

encode_i64_to_big_endian()

(i64) -> ([byte], Error)

Encodes a signed 64-bit integer to 8 bytes in big-endian order.


decode_i64_from_big_endian()

([byte]) -> (i64, Error)

Decodes 8 bytes in big-endian order to a signed 64-bit integer.


encode_u64_to_big_endian()

(u64) -> ([byte], Error)

Encodes an unsigned 64-bit integer to 8 bytes in big-endian order.


decode_u64_from_big_endian()

([byte]) -> (u64, Error)

Decodes 8 bytes in big-endian order to an unsigned 64-bit integer.


128-bit Encoding

Little Endian

encode_i128_to_little_endian()

(i128) -> ([byte], Error)

Encodes a signed 128-bit integer to 16 bytes in little-endian order.


decode_i128_from_little_endian()

([byte]) -> (i128, Error)

Decodes 16 bytes in little-endian order to a signed 128-bit integer.


encode_u128_to_little_endian()

(u128) -> ([byte], Error)

Encodes an unsigned 128-bit integer to 16 bytes in little-endian order.


decode_u128_from_little_endian()

([byte]) -> (u128, Error)

Decodes 16 bytes in little-endian order to an unsigned 128-bit integer.


Big Endian

encode_i128_to_big_endian()

(i128) -> ([byte], Error)

Encodes a signed 128-bit integer to 16 bytes in big-endian order.


decode_i128_from_big_endian()

([byte]) -> (i128, Error)

Decodes 16 bytes in big-endian order to a signed 128-bit integer.


encode_u128_to_big_endian()

(u128) -> ([byte], Error)

Encodes an unsigned 128-bit integer to 16 bytes in big-endian order.


decode_u128_from_big_endian()

([byte]) -> (u128, Error)

Decodes 16 bytes in big-endian order to an unsigned 128-bit integer.


256-bit Encoding

Little Endian

encode_i256_to_little_endian()

(i256) -> ([byte], Error)

Encodes a signed 256-bit integer to 32 bytes in little-endian order.


decode_i256_from_little_endian()

([byte]) -> (i256, Error)

Decodes 32 bytes in little-endian order to a signed 256-bit integer.


encode_u256_to_little_endian()

(u256) -> ([byte], Error)

Encodes an unsigned 256-bit integer to 32 bytes in little-endian order.


decode_u256_from_little_endian()

([byte]) -> (u256, Error)

Decodes 32 bytes in little-endian order to an unsigned 256-bit integer.


Big Endian

encode_i256_to_big_endian()

(i256) -> ([byte], Error)

Encodes a signed 256-bit integer to 32 bytes in big-endian order.


decode_i256_from_big_endian()

([byte]) -> (i256, Error)

Decodes 32 bytes in big-endian order to a signed 256-bit integer.


encode_u256_to_big_endian()

(u256) -> ([byte], Error)

Encodes an unsigned 256-bit integer to 32 bytes in big-endian order.


decode_u256_from_big_endian()

([byte]) -> (u256, Error)

Decodes 32 bytes in big-endian order to an unsigned 256-bit integer.


Float Encoding

Little Endian

encode_f32_to_little_endian()

(f32) -> ([byte], Error)

Encodes a 32-bit float to 4 bytes in little-endian order (IEEE 754).

import @binary

do encode_float32() {
    temp data, err = binary.encode_f32_to_little_endian(3.14)
    // data is 4 bytes representing the float
}

decode_f32_from_little_endian()

([byte]) -> (float, Error)

Decodes 4 bytes in little-endian order to a 32-bit float.


encode_f64_to_little_endian()

(f64) -> ([byte], Error)

Encodes a 64-bit float to 8 bytes in little-endian order (IEEE 754).


decode_f64_from_little_endian()

([byte]) -> (float, Error)

Decodes 8 bytes in little-endian order to a 64-bit float.


Big Endian

encode_f32_to_big_endian()

(f32) -> ([byte], Error)

Encodes a 32-bit float to 4 bytes in big-endian order (IEEE 754).


decode_f32_from_big_endian()

([byte]) -> (float, Error)

Decodes 4 bytes in big-endian order to a 32-bit float.


encode_f64_to_big_endian()

(f64) -> ([byte], Error)

Encodes a 64-bit float to 8 bytes in big-endian order (IEEE 754).


decode_f64_from_big_endian()

([byte]) -> (float, Error)

Decodes 8 bytes in big-endian order to a 64-bit float.


Example Program

import @std
import @binary

do serialize_u64(v u64) -> [u8] {
    temp data, err = binary.encode_u64_to_little_endian(v)
    if err != nil {
        panic(err.message)
    }
    return cast(data, [u8])
}

do deserialize_u64(bytes [byte]) -> u64 {
    temp value, err = binary.decode_u64_from_little_endian(bytes)
    if err != nil {
        panic(err.message)
    }
    return value
}

do main() {
    // Encode a u64 value
    temp original u64 = 12345678901234
    temp serialized = serialize_u64(original)
    std.println("Serialized bytes:", serialized)

    // Decode it back
    temp decoded = deserialize_u64(cast(serialized, [byte]))
    std.println("Decoded value:", decoded)

    // Verify round-trip
    if original == decoded {
        std.println("Round-trip successful!")
    }
}