jam.types.base.integers
Integer type implementations for the JAM protocol.
Type Definitions
Fixed-width Types
U8: 8-bit unsigned integer
U16: 16-bit unsigned integer
U32: 32-bit unsigned integer
U64: 64-bit unsigned integer
U128: 128-bit unsigned integer
U256: 256-bit unsigned integer
I8: 8-bit signed integer
I16: 16-bit signed integer
I32: 32-bit signed integer
I64: 64-bit signed integer
I128: 128-bit signed integer
I256: 256-bit signed integer
Variable-width Type
Int: Variable-width unsigned integer that supports values < 2⁶⁴
Encoding Format
Fixed-width Integers
Little-endian byte order:
U8(42) -> [2A]
U16(42) -> [2A 00]
U32(42) -> [2A 00 00 00]
U64(42) -> [2A 00 00 00 00 00 00 00]
U128(42) -> [2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
U256(42) -> [2A 00 ... 00] (32 bytes)
Variable-width Integer
Compact encoding for values < 2⁶⁴:
0x00-0xFC -> [value] # 1 byte
0x00-0xFFFF -> [XX value_lo value_hi] # 3 bytes
0x00-0xFFFFFF -> [XX value0 value1 value2] # 4 bytes
0x00-0xFFFFFFFF -> [XX value0..value3] # 5 bytes
Implementation Details
Memory Layout
Fixed-width types use native integer types
No padding bytes
Explicit alignment for larger types
Direct buffer access for efficiency
Range Validation
Unsigned only (no negative values)
Maximum value checks
Overflow detection
Size validation
Error Handling
Common error cases:
Value out of range:
if value > max_value: raise ValueError(f"Value {value} exceeds maximum {max_value}")
Buffer underflow:
if len(buffer) - offset < size: raise BufferError(f"Need {size} bytes, have {len(buffer) - offset}")
Invalid encoding:
if prefix not in (0xFF, 0xFE, 0xFD) and value > 0xFC: raise DecodeError(f"Invalid prefix {prefix} for value {value}")
Examples
Fixed-width Usage
from jam.types.base.integers import U32
# Create and encode
value = U32(42)
encoded = value.encode() # -> [2A 00 00 00]
# Decode
decoded = U32.decode(encoded) # -> 42
# Buffer operations
buffer = bytearray(4)
written = value.encode_into(buffer, 0) # -> 4
decoded, read = U32.decode_from(buffer, 0) # -> (42, 4)
Variable-width Usage
from jam.types.base.integers import Int
# Small values use 1 byte
value = Int(42)
encoded = value.encode() # -> [2A]
# Larger values use more bytes
value = Int(1000)
encoded = value.encode() # -> [_XX_ E8 03]
# Decode
decoded = Int.decode(encoded) # -> 1000
API Reference
Classes
- class jam.types.base.integers.U8(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.U16(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.U32(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.U64(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.U128(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.U256(value: int | BaseInteger)[source]
Bases:
FixedInt- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing
- has_sign = False
- class jam.types.base.integers.Int(value: int | BaseInteger)[source]
Bases:
BaseInteger,Codable- __init__(value: int | BaseInteger)[source]
Initialize an integer.
- static decode_from(buffer: bytes | bytearray | memoryview, offset: int = 0) Tuple[Any, int][source]
Decode from buffer. Must be implemented by subclasses or added via decorator.
- Parameters:
buffer – Buffer to decode from
offset – Starting position in buffer
- Returns:
The decoded value
Number of bytes read
- Return type:
Tuple containing