{"record":{"id":"adcb2294cdfda0d3","repo":"TheAlgorithms/Python","slug":"base16-encoded-data-is-invalid-data-does-not-have","errorCode":null,"errorMessage":"Base16 encoded data is invalid:\nData does not have an even number of hex digits.","messagePattern":"Base16 encoded data is invalid:\nData does not have an even number of hex digits\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ciphers/base16.py","lineNumber":47,"sourceCode":"    Traceback (most recent call last):\n      ...\n    ValueError: Base16 encoded data is invalid:\n    Data does not have an even number of hex digits.\n    >>> base16_decode('48656c6c6f20576f726c6421')\n    Traceback (most recent call last):\n      ...\n    ValueError: Base16 encoded data is invalid:\n    Data is not uppercase hex or it contains invalid characters.\n    >>> base16_decode('This is not base64 encoded data.')\n    Traceback (most recent call last):\n      ...\n    ValueError: Base16 encoded data is invalid:\n    Data is not uppercase hex or it contains invalid characters.\n    \"\"\"\n    # Check data validity, following RFC3548\n    # https://www.ietf.org/rfc/rfc3548.txt\n    if (len(data) % 2) != 0:\n        raise ValueError(\n            \"\"\"Base16 encoded data is invalid:\nData does not have an even number of hex digits.\"\"\"\n        )\n    # Check the character set - the standard base16 alphabet\n    # is uppercase according to RFC3548 section 6\n    if not set(data) <= set(\"0123456789ABCDEF\"):\n        raise ValueError(\n            \"\"\"Base16 encoded data is invalid:\nData is not uppercase hex or it contains invalid characters.\"\"\"\n        )\n    # For every two hexadecimal digits (= a byte), turn it into an integer.\n    # Then, string the result together into bytes, and return it.\n    return bytes(int(data[i] + data[i + 1], 16) for i in range(0, len(data), 2))\n\n\nif __name__ == \"__main__\":\n    import doctest\n","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/ciphers/base16.py#L29-L65","documentation":"Raised by base16_decode() when the input string has an odd number of characters. Per RFC 3548, each byte is exactly two hexadecimal digits, and the decoder builds bytes via int(data[i] + data[i+1], 16) in steps of 2 — an odd-length string would leave a dangling half-byte, so it is rejected before charset validation.","triggerScenarios":"Calling base16_decode('abc') (3 chars), base16_decode('0'), or any hex string of odd length. Even-length strings with bad characters hit the other ValueError instead.","commonSituations":"Hand-truncated hex strings, strings that lost a leading '0' (e.g. formatting with %X instead of %02X), or concatenating partial hex fragments.","solutions":["Re-encode the source bytes with .hex().upper() (always even length) instead of hand-formatting.","Pad a known-short value: data.zfill(len(data) + len(data) % 2).","If odd length means corrupt data, reject it in your pipeline rather than repairing blindly."],"exampleFix":"# before\nbase16_decode('f1a')  # ValueError: ...odd number of hex digits\n\n# after\nbase16_decode('0f1a')  # b'\\x0f\\x1a'","handlingStrategy":"validation","validationCode":"if len(data) % 2 != 0:\n    raise ValueError(f'hex string must have even length, got {len(data)}')","typeGuard":"def is_even_length_hex(s: str) -> bool:\n    return len(s) % 2 == 0 and set(s) <= set('0123456789ABCDEF')","tryCatchPattern":"try:\n    base16_decode(data)\nexcept ValueError as e:\n    if 'even number' in str(e):\n        base16_decode(data.zfill(len(data) + 1))\n    else:\n        raise","preventionTips":["Generate hex with bytes.hex().upper() — it is always even-length and uppercase.","When formatting single bytes, use %02X / f'{b:02X}' so leading zeros survive."],"tags":["cipher","encoding","base16","validation","python"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}