Source code for raiiaf.core.header

"""Header utilities for RAIIAF files.

This module defines functions to initialize, parse, and validate the RAIIAF
file header. The header layout is defined by ``raiiaf.core.constants.HEADER_FORMAT``
and has the following fields:

- magic (6s): ASCII bytes b"raiiaf"
- version_major (B)
- version_minor (B)
- flags (B)
- chunk_table_offset (I)
- chunk_table_size (I)
- chunk_count (I)
- file_size (I)
- reserved (I)
"""

import struct
from .constants import HEADER_SIZE, HEADER_FORMAT
from .exceptions import raiiafCorruptHeader


[docs] def header_init( version_major=1, version_minor=0, flags=0, chunk_table_offset=0, chunk_table_size=0, chunk_count=0, file_size=0, reserved=0, ): """Initialize and pack a RAIIAF file header. Args: version_major (int): Major version number. version_minor (int): Minor version number. flags (int): Header flags. chunk_table_offset (int): Offset (in bytes) to the start of the chunk table. chunk_table_size (int): Size (in bytes) of the chunk table. chunk_count (int): Number of chunks referenced in the table. file_size (int): Total file size in bytes. reserved (int): Reserved for future use. Returns: bytes: Packed header bytes conforming to HEADER_FORMAT. """ return struct.pack( HEADER_FORMAT, b"raiiaf", version_major, version_minor, flags, chunk_table_offset, chunk_table_size, chunk_count, file_size, reserved, )
[docs] def header_parse(buf: bytes) -> dict: """Parse a RAIIAF header from raw bytes. Args: buf (bytes): Raw file bytes containing the header at the beginning. Returns: dict: Parsed header fields with keys: magic, version_major, version_minor, flags, chunk_table_offset, chunk_table_size, chunk_count, file_size, reserved. Raises: raiiafCorruptHeader: If the provided buffer is too small. """ import struct if len(buf) < HEADER_SIZE: raise raiiafCorruptHeader(message="Header too small") vals = struct.unpack(HEADER_FORMAT, buf[:HEADER_SIZE]) magic = vals[0] version_major = vals[1] version_minor = vals[2] flags = vals[3] chunk_table_offset = vals[4] chunk_table_size = vals[5] chunk_count = vals[6] file_size = vals[7] reserved = vals[8] return { "magic": magic, "version_major": version_major, "version_minor": version_minor, "flags": flags, "chunk_table_offset": chunk_table_offset, "chunk_table_size": chunk_table_size, "chunk_count": chunk_count, "file_size": file_size, "reserved": reserved, }
[docs] def header_validate(header: dict) -> bool: """Validate a parsed RAIIAF header. Args: header (dict): Parsed header fields as returned by header_parse. Returns: bool: True if the header is valid, False otherwise. """ if header["magic"] != b"raiiaf": return False if header["version_major"] < 1: return False if header["chunk_count"] < 0: return False return True