#include "device/bluetooth/public/cpp/bluetooth_address.h"
#include <array>
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
namespace device {
bool ParseBluetoothAddress(std::string_view input, base::span<uint8_t> output) {
if (output.size() != 6)
return false;
if (input.size() == 12)
return base::HexStringToSpan(input, output);
if (input.size() == 17) {
const char separator = input[2];
if (separator != '-' && separator != ':')
return false;
return (input[2] == separator) && (input[5] == separator) &&
(input[8] == separator) && (input[11] == separator) &&
(input[14] == separator) &&
base::HexStringToSpan(input.substr(0, 2), output.subspan<0, 1>()) &&
base::HexStringToSpan(input.substr(3, 2), output.subspan<1, 1>()) &&
base::HexStringToSpan(input.substr(6, 2), output.subspan<2, 1>()) &&
base::HexStringToSpan(input.substr(9, 2), output.subspan<3, 1>()) &&
base::HexStringToSpan(input.substr(12, 2), output.subspan<4, 1>()) &&
base::HexStringToSpan(input.substr(15, 2), output.subspan<5, 1>());
}
return false;
}
std::string CanonicalizeBluetoothAddress(std::string_view address) {
std::array<uint8_t, 6> bytes;
if (!ParseBluetoothAddress(address, bytes))
return std::string();
return CanonicalizeBluetoothAddress(bytes);
}
std::string CanonicalizeBluetoothAddress(
base::span<const uint8_t, 6> address_bytes) {
return base::StringPrintf(
"%02X:%02X:%02X:%02X:%02X:%02X", address_bytes[0], address_bytes[1],
address_bytes[2], address_bytes[3], address_bytes[4], address_bytes[5]);
}
}