Coverage for src / bluetooth_sig / types / address.py: 88%

17 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 20:14 +0000

1"""Bluetooth address utilities. 

2 

3This module provides utilities for working with Bluetooth device addresses 

4(BD_ADDR), commonly represented as 48-bit MAC addresses. 

5""" 

6 

7from __future__ import annotations 

8 

9 

10def mac_address_to_bytes(mac_address: str) -> bytes: 

11 """Convert a MAC address string to 6 bytes. 

12 

13 Args: 

14 mac_address: MAC address string (e.g., "AA:BB:CC:DD:EE:FF") 

15 

16 Returns: 

17 6-byte representation of the MAC address 

18 

19 Raises: 

20 ValueError: If MAC address format is invalid 

21 

22 Example: 

23 >>> mac_address_to_bytes("AA:BB:CC:DD:EE:FF").hex() 

24 'aabbccddeeff' 

25 """ 

26 # Remove colons/dashes and convert to bytes 

27 cleaned = mac_address.replace(":", "").replace("-", "") 

28 if len(cleaned) != 12: 

29 msg = f"Invalid MAC address format: {mac_address}" 

30 raise ValueError(msg) 

31 

32 try: 

33 return bytes.fromhex(cleaned) 

34 except ValueError as err: 

35 msg = f"Invalid MAC address hex characters: {mac_address}" 

36 raise ValueError(msg) from err 

37 

38 

39def bytes_to_mac_address(data: bytes | bytearray) -> str: 

40 """Convert 6 bytes to a MAC address string. 

41 

42 Args: 

43 data: 6-byte representation of MAC address 

44 

45 Returns: 

46 MAC address string with colon separators (e.g., "AA:BB:CC:DD:EE:FF") 

47 

48 Raises: 

49 ValueError: If data is not exactly 6 bytes 

50 

51 Example: 

52 >>> bytes_to_mac_address(bytes.fromhex("aabbccddeeff")) 

53 'AA:BB:CC:DD:EE:FF' 

54 """ 

55 if len(data) != 6: 

56 msg = f"MAC address must be exactly 6 bytes, got {len(data)}" 

57 raise ValueError(msg) 

58 return ":".join(f"{b:02X}" for b in data) 

59 

60 

61__all__ = ["mac_address_to_bytes", "bytes_to_mac_address"]