Bytefolge einer variable anzeigen.
-
Ja ich mal wieder,
mit dem heutigen problem,"wie kriege ich eine direkte Byte folge verglichen und angezeigt"

Ich habe ein UDP (DHCP) Packet, welches Daten für das PXE-Request (BootP-Request) enthält.jetz habe ich das problem, dass ich die MAC-Addresse, welche in Bytes vorliegt, nicht zusehen bekomme (somit auch nicht zwischenspeichern kann)

(nur ein " >/#####") aber das ist nicht das was ich möchte sondern das:0000 00 0c 29 3e 18 5c | .......habe auch folgendes getan:
int Handle_BootFile_Request(int con, char * data) { char cli_macaddress[6]; char cli_vendoridnt[9]; char cli_systemarch[1]; memcpy(cli_macaddress,&data[0x46],sizeof(cli_macaddress)); memcpy(cli_vendoridnt,&data[0x125],sizeof(cli_vendoridnt)); cout << &cli_macaddress << endl; return errno; } aber entweder steht garnichts da oder dieses komische sonderzeichen-zeugs =/
-
Du meinst also binär?
Hier ein Beispiel:int bin = 3; for (int i = sizeof (bin) * 8 - 1; i >= 0; i++) { if (bin & (1 << i)) std::cout << "1"; else std::cout << "0"; }Wird ausgeben: 00000000000000000000000000000011
(Ich hoffe ich hab mich nicht vertippt :D)Also:
sizeof() gibt ja bekanntlich die Größe der Variable in Bytes zurück.
Wir wollen aber die Bits.
Deswegen multiplizieren wir es mit 8.
Dann müssen wir davon noch 1 abziehen, da Bits bei 0 anfangen.
Mit i-- iterieren wir einfach durch alle Bits.& Ist ein bitweises UND. Also es gibt uns wahr zurück wenn das Bit gesetzt ist.
<< ist der Shiftoperator der 1 um die Anzahl Bits verschiebt, welches wir benötigen, sodass dann das linke Bit das ist, welches geprüft werden soll.
Dies macht dann das bitweise UND und wenn es wahr ist geben wir "1" aus, wenn nicht dann "0".
Ich hoffe es war verständlich
Edit: Ach, du wolltest es hexadezimal. Naja, kann man ja umwandeln, aber dann kannst du ja cauch direkt dezimal in hexadezimal umwandeln.
-
nein nicht in Bits, ich meine Bytes

ich schätzemal, dass es nicht so verständlich war, ich meine dass ich ne variable habe wo dann die MAC-drin steht

char * macadress[6] = 00 0c 02 ...;
-
Aber das macht ja keinen unterschied.
Wandle die Bits einfach in hexadezimale Zahlen um ODER wandle direkt die ASCII-Zeichen in hexadezimale Zeichen.
-
Ja, würde ich wenn ich wüsste wie..

-
#include <cstdio> int main() { int i = 34523452; auto p = reinterpret_cast<const unsigned char*>(&i); for (auto q = p; q != p + sizeof i; ++q) { std::printf("%02X ", static_cast<unsigned>(*q)); } }
-
cooky, warum nicht
int i = 34523452; do std::printf("%02X ", i & 255); while( i >>= 8 );Das ganze soll doch nicht etwa Endianness-abhängig ausgegeben werden?
Edit: ...
-
Iiih, printf. :p
-
resultiert in 00:00:00:00:00:00:
unsigned char* p = reinterpret_cast<unsigned char*>(&cli_macaddress); for (unsigned char* q = p; q != p + sizeof(cli_macaddress); ++q) { std::printf("%02X:", static_cast<unsigned>(*q)); }* Format stimmt ja schonmal ...

vorallem ist "cli_macaddress" ja char und nicht int
