Skip to main content

fletchr-measurand

Arrow-native bit-fragment extraction and engineering-unit decoding for binary protocol data. Parses parameter and measurand spec strings into evaluable objects; runs them against pa.Tables whose data columns are fletchr.uintn extension arrays.

Why?

Bit-packed protocol data routinely needs two things:

  • Bit-fragment extraction — "this value is word 3 concatenated with word 4 as a 16-bit value." Done by hand, it's masking and shifting; done at scale, it's bugs.
  • Engineering-unit decoding — "raw × 0.1 + (-273.15)" for a scaled measurement.

fletchr-measurand makes both declarative. Parameter("[1+2]") extracts word 1 concatenated with word 2; Measurand(parameter=..., encoding="2c", euc=EUC(...)) adds decoding (two's complement, float, etc.) and scaling.

Features

  • Parameter DSL[1] (single word), [1+2] (multi-word, MSB first), [1-3] (range), [1+3+5] (non-contiguous concatenation); plus generator / iteration patterns for repeated bit-fragments at successive column offsets.
  • Level 1 encodings via byteforge — unsigned, sign-magnitude, one's-complement, two's-complement, offset-binary, IEEE 754 (32/64), MIL-STD-1750A (32/48), packed BCD, Gray code, IBM/DEC/TI floats.
  • Level 2 EUC — linear scaling (scale_factor, data_bias, scaled_bias) and arbitrary callable transforms.
  • Arrow-native build chainParameter.build and Measurand.build consume pa.Table directly and return pa.ExtensionArray / MeasurandResult. Validity bitmaps propagate through both decode levels.
  • Field-metadata convention — the fletchr.encoding / fletchr.scale_factor / fletchr.data_bias / fletchr.scaled_bias keys defined in SPEC-decode.md give a language-neutral wire format for decode rules attached to Arrow column metadata.

Install

uv add fletchr-measurand        # or: pip install fletchr-measurand

Requires Python 3.9+. Pulls in fletchr-uintn, pyarrow >= 16, numpy >= 2.0, byteforge, lark, and antlr4-python3-runtime.

Quickstart

import pyarrow as pa
from fletchr_uintn import uintn_array
from fletchr_measurand import EUC, Measurand, parameter_parser

# A FrameArray-shaped pa.Table: one column per word position (c1..cN,
# 1-based), each a fletchr.uintn column. Real users get this from
# fletchr-core's FrameArray; constructed manually here for illustration.
table = pa.table({
    "c1": uintn_array([0x12, 0x34, 0x56], bits=8),
    "c2": uintn_array([0xFF, 0x80, 0x00], bits=8),
    "c3": uintn_array([0x10, 0x20, 0x30], bits=8),
})

# Parameter spec is 1-based: [2] selects word 2 (column c2). Decode it as
# signed two's-complement, then linear-scale to Celsius from a centikelvin
# raw representation.
m = Measurand(
    parameter=parameter_parser.parse("[2]"),
    encoding="2c",
    euc=EUC(scale_factor=0.1, scaled_bias=-273.15),
)

result = m.build(table)
result.dns.to_pylist()        # [255, 128, 0]       — raw 8-bit DNs
result.decoded.to_pylist()    # [-1, -128, 0]       — Level 1: two's-complement
result.values.to_pylist()     # [-273.25, -285.95, -273.15]  — Level 2: scale + bias

Multi-word values use + to concatenate, MSB first:

# Words 2 and 3 as a single 16-bit unsigned value (c1 high, c2 low).
m16 = Measurand(parameter=parameter_parser.parse("[2+3]"))
m16.build(table).values.to_pylist()    # [65296, 32800, 48]

See SPEC-decode.md for the full encoding registry and the field-metadata convention.

Public API

from fletchr_measurand import (
    # Parameter / Measurand DSL
    Parameter, ParameterSpec, parameter_parser,
    Measurand, MeasurandSpec, measurand_parser,
    resolve_parameter, resolve_measurand,
    # Result + Level 2 transform
    MeasurandResult,
    EUC, SamplingStrategy,
    # Calculator parser (for the SPEC's expression-mode hook)
    calculator_parser,
)

Status

The runtime data model (Parameter, Measurand, MeasurandResult, EUC) is stable. The wire-format convention in SPEC-decode.md is draft v0.5 — the encoding registry is locked, but one open question remains (the expression-mode allow-list) before incrementing to v1.0. Field-metadata read/write helpers that round-trip the SPEC keys onto pa.Field.metadata are tracked as future work.

Links

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fletchr_measurand-0.2.0.tar.gz (83.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fletchr_measurand-0.2.0-py3-none-any.whl (69.8 kB view details)

Uploaded Python 3

File details

Details for the file fletchr_measurand-0.2.0.tar.gz.

File metadata

  • Download URL: fletchr_measurand-0.2.0.tar.gz
  • Upload date:
  • Size: 83.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fletchr_measurand-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a5a47678527aba4d6099beb57f299da22668ad4fffefab0224d77c5ece88b33d
MD5 1aecf351e85d2763b6f1020e0d4f1894
BLAKE2b-256 1d7b7345e7ba69d9252807bb332436f83b8cc9a65a61c7c58f151fe58e2e0f48

See more details on using hashes here.

File details

Details for the file fletchr_measurand-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: fletchr_measurand-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 69.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fletchr_measurand-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b8804fdc07ffce9f3a59d8b02fcd64a20e6830adb376e633ff9cf8781ff826dc
MD5 490aaed0140ada873dc839301f3814f8
BLAKE2b-256 9235161a3b3b608f4f6739c23235b669bdd81d436b7e68b3cb091a7b7e453773

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.0

2 files

This release

0.2.0 This release

2 files

0.1.0

2 files

0.0.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page