Bunny
Addicted
|
Halloo Leute !
ich komm gleich mal zum wesentlichen... ich hab in der schule folgendes Beispiel aufbekommen... nur kenn ich mich eigentlich nicht wirklich aus bzw. fehlt bis jetzt noch das Verständniss dazu...
Das Beispiel:
Wiederholung Netzwerktechnik: IP-Adresse: 4 Zahlen(Bytes) bzw. 32 Bits
"Intern" werden Ip-Adressen sinnvollerweise als ein Wert (32-bit Integer ohne Vorzeichen) gespeichert. Beispiel: aus der Ip-adresse 1.2.3.4 wird die Zahl 16909060 bzw. Hexadezimal 1020304
Passende Typen (statt int bzw. unsigned int)
uint8_t 8 Bit, unsigned uint32_t 32 Bit, unsigned
Wir verwenden den Qt Creator, somit benötigen wir die <stdint.h> im Header
Und jetzt kommen die Unterprogramme dazu... :
Schreibe folgende Unterprogramme und teste mit sinnvollen Werten im Hauptprogramm ( Ausgabe OK/Fehler)
::Umwandlung 4 Zahlen in internes Format::
uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4); // Prototyp
Tipp: operator <<
Vorschlag für Test:
if(bytes2ip(0x01, 0x02, 0x03, 0x04) != 0x01020304L) cerr << "Fehler in Zeile" << __LINE__ << "\n";
assert (bytes2ip(192,168,1,2) == 3232235778L);
::Umwandeln andere Richtung::
void ip2bytes(uint32_t IP, uint8_t& a1, uint8_t& a2, uint8_t& a3, uint8_t& a4);
Tipp: operator &
Metatipp: Diese Funktionen kann man hintereinander aufrufen 4 Zahlen --> bytes2ip --> Zwischenergebnis --> ip2bytes --> 4 Zahlen Test: die vorderen 4 zahlen stimmen mit den hinteren 4 zahlen überein
tja... das wärs mal fürs erste... also ich hab wirklich keine durchblick.. ich versteh zwar was man theoretisch machen sollte.. aber wie ich das umwandeln soll .. pf... da steh ich an... vlt is ja der eine oder andere so nett und kann mir dabei helfen....
lg thomas
|
watchout
Legendundead
|
naja... wenn ich die angabe nicht falsch verstanden hab ists in dem Fall wohl mit ner union am einfachsten union ipaddr {
uint32_t longval;
uint8_t bytes[4];
};
lies nach was union datenstrukturen machen, damit du's auch anwenden kannst "<<" bzw. ">>" sind left bzw. right shifts, schätze die meinen man soll immer 8 bit hoch shiften und dann rein ORen... halt ich aber für etwas umständlich, vor Allem beim zerteilen Ich werd nie verstehen warum man mit C++ in Schulen anfangen muss wenn dann eh nur C verwendet wird...
Bearbeitet von watchout am 06.10.2010, 14:05 (array fix)
|
Bunny
Addicted
|
@watchout
danke mal für deine antwort... aber wie soll ich den quellcode einsetzn ? gehört der code ins hauptprogramm oder ins erste unterprogramm?? und wie kann ich das union dann benutzen ?
ich versteh die lehrer auch nicht.. alles wird vorausgesetzt, dabei wird nix erklärt... im selbststudium kann man sich alles selber bei bringen...
|
watchout
Legendundead
|
Ich glaub wenn ich dir das schreib dann mach ich glaub ich die ganze Übung für dich .. Naja was solls, die andere Richtung darfst dir selbst überlegen typedef union {
uint32_t longval;
uint8_t bytes[4];
} ipaddr_t;
void toshort(uint32_t ip_in, uint8_t* ip0, uint8_t* ip1, uint8_t* ip2, uint8_t* ip3)
{
ipaddr_t ipaddr;
ipaddr.longval = ip_in;
*ip0 = ipaddr.bytes[3];
*ip1 = ipaddr.bytes[2];
*ip2 = ipaddr.bytes[1];
*ip3 = ipaddr.bytes[0];
}
|
watchout
Legendundead
|
Hab übrigens nicht umsonst geschrieben du sollst nachlesen was unions sind und machen
|
Bunny
Addicted
|
haha, danke dir !!.. aber bei mir is das immer so.. ich brauch mal ein ansatz .. und dann werd ich schon irgendwie drauf kommen !!!
sehr nett von dir !!
|
watchout
Legendundead
|
Der Ansatz war mein erster Post Obwohl ich zugeben muss dass ich auf den 4 Zeilen einen Syntaxfehler geschafft hab... *hust*
|
Bunny
Addicted
|
haha =)
|
Bunny
Addicted
|
also ich komm trotzdem nicht weiter... bin anscheinend unfähig für c++ .....
|
watchout
Legendundead
|
naja woran hängts?
|
Bunny
Addicted
|
naja weil ich einfach nicht das verständnis hab... den code den ich von dir habe ist für das unterprogramm....
so, und jetzt brauch ich einfach drei variablen im hauptprogramm definiert in die ich werte einlese , oder ? Diese werte sollen dann ins unterprogramm übergeben werden..
welchen typ sollen die variablen haben.. .int ? oder auch diesen uint8_t ?
...
EDIT: was mich interessierten würde ist mal , wie rechne ich von integer um in uint8_t bzw. hex... dann wär mir ja shcon mal geholfen...
Bearbeitet von Bunny am 06.10.2010, 15:14
|
watchout
Legendundead
|
Dachte zumindest Einlesen und Ausgeben von Variablen solltet ihr im Unterricht behandelt haben? So wie ich das aber seh verlangt die Angabe aber keine Eingabe vom Benutzer, sondern es soll nur eine Testroutine geschrieben werden.
uint8/16/32/64_t... sind Datentypen die auf allen Systemen definitiv die Anzahl Bits haben, im Gegensatz zu sagen wir int. Int hat auf einem 8 Bit Prozessor 8 Bit, auf einem 32 Bit Prozessor 32 Bit und auf einem aktuellen 64 Bit System eben 64 Bit, ähnlich verhält es sich mit long. Long ist normal 2*int (wobei ich nicht weiß ob das standardisiert is), es gibt auch long long, etc.
|
Bunny
Addicted
|
okay, das erste unterprogramm hab ich gelöst... es funktioniert!! #include <iostream>
#include <stdint.h>
#include <assert.h>
uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4); // Prototyp
int main()
{
bytes2ip(1,2,3,4);
assert(bytes2ip(1,2,3,4) == 0x01020304L);
}
uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4)
{
return ((a1 << 24) + (a2 << 16) + (a3 << 8) + a4);
}
Bearbeitet von Bunny am 06.10.2010, 21:16
|
watchout
Legendundead
|
Jo schaut gut aus, nur verwend bitte den [ code ] oder [ php ] Tag wenn du Code im Forum postest.
|
that
ModeratorHoffnungsloser Optimist
|
Für diesen Threadtitel und für die Fragestellung verdienst du eigentlich überhaupt keine Hilfe, aber ich lasse den Thread trotzdem mal offen. Bitte lies die Regeln im ersten Post vollständig durch und halte dich ab sofort daran.
|