формат вывода для MAC-адреса (C ++, stringstream) - PullRequest
2 голосов
/ 03 января 2011

Я нашел код:

static void PrintMACaddress(unsigned char MACData[])
{
    printf("MAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n", 
        MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
}

эта функция печатает MAC-адрес как 00-53-45-00-00-00

Мой вопрос:

Как сделать такоеформатирования при печати в std::stringstream?

Обновление:

Спасибо всем за советы!

Не знаю почему, но некоторые изрешения без static_cast<unsigned int> дали мне странные символы, такие как ☻-0→-0M-0Ы-0m-0╜ Так что я выбираю версию Boost от icecrime :

void PrintMACaddressWithBoostFormat(unsigned char MACData[])
{
    boost::format fmt("%02X-%02X-%02X-%02X-%02X-%02X");

    for (int i = 0; i != 6; ++i)
    {
        fmt % static_cast<unsigned int>(MACData[i]);
    }

    std::stringstream valStream(fmt.str().c_str());

    //testing
    std::cout << "Boost version: " << valStream.str().c_str() << std::endl;
}

Palmik 's решение тоже отлично работает;)

Спасибо!

Ответы [ 4 ]

5 голосов
/ 03 января 2011

Возможно немного не по теме, но я бы лично использовал Boost.Format :

boost::format fmt("%02X-%02X-%02X-%02X-%02X-%02X");
for (int i = 0; i != 6; ++i)
    fmt % static_cast<unsigned int>(MACData[i]);
std::cout << fmt << std::endl;
4 голосов
/ 03 января 2011

Вы можете сделать это следующим образом (без изменения существующего дизайна приложения (я думаю, вы не можете, иначе вы, вероятно, сделали бы это:)))

void printMacToStream(std::ostream& os, unsigned char MACData[])
{
    // Possibly add length assertion
    char oldFill = os.fill('0');

    os << std::setw(2) << std::hex << static_cast<unsigned int>(MACData[0]);
    for (uint i = 1; i < 6; ++i) {
        os << '-' << std::setw(2) << std::hex << static_cast<unsigned int>(MACData[i]);
    }

    os.fill(oldFill);

    // Possibly add:
    // os << std::endl;
}

Использование:

std::stringstream ss;
printMacToStream(ss, arrayWIthMACData);

Обновление: HEX формат:)

1 голос
/ 03 января 2011

Сначала вы должны преобразовать свой код, чтобы использовать потоки и манипуляторы C ++, например,

std::cout << std::hex << std::setw(2) << std::setfill('0') << MACData[0] ...

Затем вы должны перегрузить оператор << для потока слева и вашего класса справа.

1 голос
/ 03 января 2011
char prev = stream.fill('0');  // save current fill character

for(int i=0; i<5; i++)
  stream << setw(2) << MACData[i] << '-';
stream << setw(2) << MACData[5];

stream.fill(prev);  // restore fill character
...