2009-06-26 11 views
2

Wie wandle ich 6 Byte, die eine MAC-Adresse repräsentieren, in eine Zeichenfolge um, die die Adresse als Doppelpunkt-getrennte Hexadezimalwerte anzeigt?C++ Umwandeln eines Byte-Binärwerts in eine Zeichenfolge

Dank

+0

Was möchten Sie in der resultierenden Zeichenfolge? Möchten Sie eine textuelle Darstellung der Bytes (z. B. hex) oder möchten Sie die 6 Bytes tatsächlich als ASCII (oder eine andere Codierung) interpretieren? – Joe

+0

Ich suche die Textdarstellung, also ja hex. – aHunter

+0

Oder ist es eine 48-Bit-Nummer? Wenn ja, in welcher Kodierung ist es und was ist die Endian-Ness? – patros

Antwort

4

Sie wahrscheinlich eine Folge von sechs Bytes wie so formatiert werden, überprüfen möchten:

aa:bb:cc:dd:ee:ff 

wo aa die in hex formatiert erste Byte ist.

etwas tun sollte:

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(); 

Wenn Sie teuer dies in einem gussartigen Stil tun wollen (von Ihrem Titel hier zu erraten), können Sie eine MAC-Klasse erstellen, implementieren die ostream-Betreiber dafür (wie mein gegebener Code) und boost::lexical_cast benutzen.

+0

Sieht aus, als ob du zuerst da warst :) – rlbond

+0

Danke, das hat wie ein Traum funktioniert. – aHunter

+0

Ich hatte schon eine Besetzung.h und fügte hinzu und es hat perfekt funktioniert. – aHunter

1
  1. Stellen Sie sicher, es null
  2. Sie benötigen, was die Zeichenfolge codiert, zu wissen, beendet ist. Wenn es ASCII ist eine einfache std :: string str ((char *) your_buffer) Wird besorgt. your_buffer sollte ein unsigned char sein. Wenn nicht, brauchen wir mehr Informationen.
+0

Wenn es nicht null terminiert ist, können Sie die Methode assign() von std :: string verwenden, die optional zwei zusätzliche Argumente für Startposition und Anzahl der Zeichen, z. std :: string str; str.assign (reinterpret_cast (buf), 0, 6); –

+0

Die Eingabe ist ein 6-Byte-Binärwert, der mir von der Net-SNMP-Bibliothek geliefert wird, und alles, was ich brauche, ist der Hex-Wert, der zurückgegeben wird, da es eine MAC-Adresse ist. – aHunter

+0

Ich habe diese Information zu Ihrer Frage hinzugefügt, da es gar nicht klar war, dass Sie das machen wollten. –

3

Nicht sicher, ob Sie Cast oder konvertieren meinen. Wenn konvertieren, dann kommt es darauf an, in welcher Form Sie es wollen. Sie könnten wollen Hex, Base-64, oktal, ...

Wenn Sie wollen, hex, betrachten STLSoft 's format_bytes() Funktion, die alle Arten von Bestellung und Gruppierung tun können.

Wenn Sie Base-64 wollen, betrachten Sie die b64 library.

HTH

[EDIT] Im Einklang mit dem Bearbeiten von Bildern auf dem OP würde die volle impl sein:

#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; 
} 

Es gibt keine Notwendigkeit in diesem Fall den Rückgabewert von format_bytes() zu überprüfen, weil Sie reichen genug Schreibpuffer ein. In einem realen Fall würden Sie

Verwandte Themen