mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-26 05:00:15 +00:00
66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
|
def octal_to_hex(octal: str) -> str:
|
||
|
"""
|
||
|
Convert an Octal number to Hexadecimal number.
|
||
|
For more information: https://en.wikipedia.org/wiki/Octal
|
||
|
|
||
|
>>> octal_to_hex("100")
|
||
|
'0x40'
|
||
|
>>> octal_to_hex("235")
|
||
|
'0x9D'
|
||
|
>>> octal_to_hex(17)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
TypeError: Expected a string as input
|
||
|
>>> octal_to_hex("Av")
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: Not a Valid Octal Number
|
||
|
>>> octal_to_hex("")
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: Empty string was passed to the function
|
||
|
"""
|
||
|
|
||
|
if not isinstance(octal, str):
|
||
|
raise TypeError("Expected a string as input")
|
||
|
if octal.startswith("0o"):
|
||
|
octal = octal[2:]
|
||
|
if octal == "":
|
||
|
raise ValueError("Empty string was passed to the function")
|
||
|
if any(char not in "01234567" for char in octal):
|
||
|
raise ValueError("Not a Valid Octal Number")
|
||
|
|
||
|
decimal = 0
|
||
|
for char in octal:
|
||
|
decimal <<= 3
|
||
|
decimal |= int(char)
|
||
|
|
||
|
hex_char = "0123456789ABCDEF"
|
||
|
|
||
|
revhex = ""
|
||
|
while decimal:
|
||
|
revhex += hex_char[decimal & 15]
|
||
|
decimal >>= 4
|
||
|
|
||
|
return "0x" + revhex[::-1]
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
import doctest
|
||
|
|
||
|
doctest.testmod()
|
||
|
|
||
|
nums = ["030", "100", "247", "235", "007"]
|
||
|
|
||
|
## Main Tests
|
||
|
|
||
|
for num in nums:
|
||
|
hexadecimal = octal_to_hex(num)
|
||
|
expected = "0x" + hex(int(num, 8))[2:].upper()
|
||
|
|
||
|
assert hexadecimal == expected
|
||
|
|
||
|
print(f"Hex of '0o{num}' is: {hexadecimal}")
|
||
|
print(f"Expected was: {expected}")
|
||
|
print("---")
|