std/endians

  Source   Edit

This module contains helpers that deal with different byte orders (endian).

Endianess is the order of bytes of a value in memory. Big-endian means that the most significant byte is stored at the smallest memory address, while little endian means that the least-significant byte is stored at the smallest address. See also https://en.wikipedia.org/wiki/Endianness.

Unstable API.

Procs

proc bigEndian16(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 16-bit big-endian order. Both buffers are supposed to contain at least 2 bytes.   Source   Edit
proc bigEndian32(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 32-bit big-endian order. Both buffers are supposed to contain at least 4 bytes.   Source   Edit
proc bigEndian64(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 64-bit big-endian order. Both buffers are supposed to contain at least 8 bytes.   Source   Edit
proc littleEndian16(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 16-bit little-endian order. Both buffers are supposed to contain at least 2 bytes.   Source   Edit
proc littleEndian32(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 32-bit little-endian order. Both buffers are supposed to contain at least 4 bytes.   Source   Edit
proc littleEndian64(outp, inp: pointer) {.inline, ...raises: [], tags: [].}
Copies inp to outp, storing it in 64-bit little-endian order. Both buffers are supposed to contain at least 8 bytes.   Source   Edit
proc swapEndian16(outp, inp: pointer) {.inline, noSideEffect, ...raises: [],
                                        tags: [].}
Copies inp to outp, reversing the byte order. Both buffers are supposed to contain at least 2 bytes.

Example:

var a = [1'u8, 2]
var b: array[2, uint8]
swapEndian16(addr b, addr a)
assert b == [2'u8, 1]
  Source   Edit
proc swapEndian32(outp, inp: pointer) {.inline, noSideEffect, ...raises: [],
                                        tags: [].}
Copies inp to outp, reversing the byte order. Both buffers are supposed to contain at least 4 bytes.

Example:

var a = [1'u8, 2, 3, 4]
var b: array[4, uint8]
swapEndian32(addr b, addr a)
assert b == [4'u8, 3, 2, 1]
  Source   Edit
proc swapEndian64(outp, inp: pointer) {.inline, noSideEffect, ...raises: [],
                                        tags: [].}
Copies inp to outp, reversing the byte order. Both buffers are supposed to contain at least 8 bytes.

Example:

var a = [1'u8, 2, 3, 4, 5, 6, 7, 8]
var b: array[8, uint8]
swapEndian64(addr b, addr a)
assert b == [8'u8, 7, 6, 5, 4, 3, 2, 1]
  Source   Edit