```python
def mask_from_prefix(prefix: int) -> str:
    if not isinstance(prefix, int) or prefix < 0 or prefix > 32:
        raise ValueError("Prefix must be an integer from 0 to 32")
    
    return ".".join(f"{(1 << (8 - i)) - 1}" for i in range(4))[::-1][:prefix].rjust(prefix, '0').zfill(8).replace('0', '255').zfill(32)

def prefix_from_mask(mask: str) -> int:
    if not isinstance(mask, str):
        raise ValueError("Mask must be a string")
    
    octets = mask.split('.')
    if len(octets) != 4:
        raise ValueError("Mask must have exactly four dot-separated fields")
    
    for octet in octets:
        if not octet.isdigit():
            raise ValueError("Each field must contain decimal digits")
        
        if octet.startswith('0') and octet != '0':
            raise ValueError("Leading zero in a non-zero field is invalid")
        
        if int(octet) > 255:
            raise ValueError("Octet cannot be above 255")
    
    if sum(int(octet) == 0 for octet in octets[:3]) != len([octet for octet in octets[1:] if int(octet) == 255]):
        raise ValueError("One bits must be unbroken by a zero")
    
    return prefix_from_octets(octets)

def prefix_from_octets(octets: list[str]) -> int:
    return sum((int(octet) & (1 << (7 - i))) > 0 for octet in octets for i in range(8))
```