Конвертация мак адрес в формате uint64_t в std::string
У меня есть переменная uint64_t mac, например пусть mac=828033638099 (это соответствует мак адресу 00:c0:ca:a6:9e:d3). Я хочу перевести эту переменную в строку std::string, написал для этого следующую функцию:
std::string mac_u64_to_s(uint64_t mac) {
std::string str = "";
std::stringstream stream;
stream << std::setfill('0')
<< std::setw(2)
<< std::hex
<< ((mac >> 40) & 0xff);
for (int i = 32; i >= 0; i= i-8){
stream << ":"
<< std::setfill('0')
<< std::setw(2)
<< std::hex
<< ((mac >> i) & 0xff);
}
str = stream.str();
return str;
}
Мне кажется эта функция — ужасна, хотелось бы найти более короткое и лаконичное решение.
upd. Исправил строки:
<< ((mac >> 40) & 0x1ff); на << ((mac >> 40) & 0xff);
<< ((mac >> i) & 0x1ff); на << ((mac >> i) & 0xff);
Ответы (2 шт):
Автор решения: eri
→ Ссылка
Чтоб просто вспомнить Си вариант через приведение типов (на c):
#include <stdio.h>
#include <stdint.h>
#include <endian.h>
int main() {
union {
uint64_t integer;
unsigned char byte[8];
} a;
uint64_t mac = 828033638099;
a.integer = htobe64(mac);
char macStr [18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
a.byte[2], a.byte[3], a.byte[4], a.byte[5], a.byte[6], a.byte[7]);
puts(macStr);
return 0;
}
Автор решения: Mikhailo
→ Ссылка
Можно так в С++20
string mac_u64_to_s(uint64_t mac) {
string str;
for(int i = 6; i-->0;
str += format("{:02x}{}",(mac>>8*i)&0xFF,i?":":""));
return str;
}