```python
def mask_from_prefix(prefix: int) -> str:
    if not isinstance(prefix, int):
        raise ValueError("Prefix must be an integer.")
    
    if not (0 <= prefix <= 32):
        raise ValueError("Prefix must be between 0 and 32 inclusive.")
    
    # Construct the mask string
    octets = []
    for i in range(4):
        ones = min(prefix, 8 - i * 8)
        zeros = 8 - ones
        octet = f"{ones:0{zeros}b}"
        octets.append(octet)
    
    return '.'.join(octets)

def prefix_from_mask(mask: str) -> int:
    if not isinstance(mask, str):
        raise ValueError("Mask must be a string.")
    
    parts = mask.split('.')
    if len(parts) != 4:
        raise ValueError("Mask must have exactly four dot-separated fields.")
    
    for part in parts:
        # Validate each field
        if not part.isdigit() or (len(part) > 1 and part[0] == '0'):
            raise ValueError(f"Invalid octet: {part}")
        
        value = int(part)
        if value < 0 or value > 255:
            raise ValueError(f"Octet out of range: {value}")
    
    # Count the leading ones
    prefix = 0
    for part in parts:
        value = int(part, 16)  # Convert hexadecimal to integer
        while value & 1 == 1:
            prefix += 1
            value >>= 1
    
    return prefix
```