2009-06-26 3 views
2

Как преобразовать 6 байтов, представляющих MAC-адрес, в строку, которая отображает адрес в виде шестизначных значений, разделенных двоеточием?C++ Листинг двоичного значения байта в строку

Благодаря

+0

Что вы хотите получить в полученной строке? Вам нужно текстовое представление байтов (например, hex) или вы хотите фактически интерпретировать 6 байтов как ASCII (или некоторую другую кодировку)? – Joe

+0

Я ищу, чтобы получить текстовое представление, так что да шестнадцатеричный. – aHunter

+0

Или это 48-битное число? Если да, то в чем кодировка, и что такое endian-ness? – patros

ответ

4

Вы, вероятно, хотите последовательность из шести байтов должен быть отформатирован следующим образом:

aa:bb:cc:dd:ee:ff 

где aa первый байт отформатирован в шестнадцатеричном формате.

Что-то вроде этого нужно сделать:

char MAC[6]; //< I am assuming this has real content 

std::ostringstream ss; 
for (int i=0; i<6; ++i) { 
    if (i != 0) ss << ':'; 
    ss.width(2); //< Use two chars for each byte 
    ss.fill('0'); //< Fill up with '0' if the number is only one hexadecimal digit 
    ss << std::hex << (int)(MAC[i]); 
} 

return ss.str(); 

Если вы дорого хотите сделать это в литом подобный стиль (угадывание из Вашего названия здесь), вы можете создать класс MAC, реализовать ostream-оператор для него (как и данный код) и используйте boost::lexical_cast.

+0

Похоже, что у вас там первый :) – rlbond

+0

Спасибо, что это сработало, как сон. – aHunter

+0

У меня уже был актёр.ч и добавил это, и он отлично работал. – aHunter

1
  1. Убедитесь, что нулем
  2. Вы должны знать, что кодирующая последовательность находится. Если это ASCII, простой станд :: строка ул ((символ *) your_buffer) Сделаю. your_buffer должен быть символом unsigned. Если это не так, нам нужна дополнительная информация.
+0

Если это не завершено нулем, вы можете использовать метод assign() std :: string, который необязательно принимает два дополнительных аргумента начальной позиции и количества символов, например. std :: string str; str.assign (reinterpret_cast (buf), 0, 6); –

+0

Ввод представляет собой двоичное значение в 6 байт, которое предоставляется мне из библиотеки Net-SNMP, и все, что мне нужно, - это шестнадцатеричное значение, которое оно возвращает, поскольку это MAC-адрес. – aHunter

+0

Я добавил эту информацию к вашему вопросу, так как совершенно не ясно, что именно это вы хотели сделать. –

3

Не уверен, если вы имеете в виду перевод или перевод. Если конвертировать, то это зависит от того, в какой форме вы хотите. Вы можете захотеть Hex, base-64, восьмеричный, ...

Если вы хотите использовать hex, рассмотрите функцию STLSoftformat_bytes(), которая может выполнять все виды упорядочивания и группировки.

Если вы хотите использовать base-64, рассмотрите b64 library.

НТН

[EDIT] В соответствии с редактированием на OP, полный реализ будет:

#include <stlsoft/conversion/byte_format_functions.hpp> 

#include <stdio.h> 

int main() 
{ 
    unsigned char mac[6]; 

    char result[STLSOFT_NUM_ELEMENTS(mac) * 3]; 

    stlsoft::format_bytes(mac, sizeof(mac), &result[0], STLSOFT_NUM_ELEMENTS(result), 1, ":"); 

    puts(result); 

    return 0; 
} 

Там нет необходимости в этом случае для проверки возвращаемого значения format_bytes(), потому что вы проходите достаточно буфера записи. В реальном случае, если вы хотели бы проверить