Конвертация мак адрес в формате 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;
    }
→ Ссылка