Ist diese Frage schwer?



  • Guten Morgen,

    folgendes Problem habe ich:
    - Die Klasse END_POINTS enthält 1- einen Konstruktor 2- Die Public-Methode getSourceAddress 3- Das Array src als privates Element (uint8_t* src;)

    Hier ist der Konstruktor:

    // for IPv4 type
    END_POINTS::END_POINTS(uint8_t srcB4, uint8_t srcB3, uint8_t srcB2, uint8_t srcB1,
    	uint8_t destB4, uint8_t destB3, uint8_t destB2, uint8_t destB1) 
    								   :Obj(ENDPOINTS_OBJ_CLASS, ENDPOINTS_IPV4_OBJ_TYPE)
    {
    	src = new uint8_t[4];
    	END_POINTS::initIPv4Address(srcB4,  srcB3,	 srcB2,  srcB1, src);
    	// das gleiche für dest
    }
    
    void END_POINTS::initIPv4Address (uint8_t b4, uint8_t b3, uint8_t b2, uint8_t b1, uint8_t* addr) {
    	addr[0] = b1;
    	addr[1] = b2;
    	addr[2] = b3;
    	addr[3] = b4; 
    }
    

    Hier ist die Funktion getSourceAddress:

    uint8_t* END_POINTS::getSourceAddress(uint8_t* source) const {
    	uint16_t bytesNumber = 4;
    	// copy source address to the return value
    	for (int i=0; i<bytesNumber; i++) {
    		source[i] = src[ i ];
    	}
    
    	return source;
    }
    

    Im Programm wird ein Objekt endp der Klasse END_POINTS wie folgt definiert:

    END_POINTS endp(10, 149, 49, 49, 10, 149, 49, 55);
    

    Mein Ziel ist es das letze Byte der Source aus der IP-Adresse zu lesen, also hier das 49. Wie kann ich das machen? Ich weiss, dass es eigentlich das Eleemnt src[3] ist, aber nachdem src private ist, weiss ich nicht, wie ich das machen soll.

    Kann mir jemand einen Tipp geben?

    Danke im Voraus,

    CL



  • source ist privat, aber in getSourceAdress() hast du seinen Inhalt nach source kopiert (und das lebt außerhalb deines Objekts) - d.h. du kannst dein letztes Byte dort auslesen.

    PS: Ich hoffe, die Klasse hat auch die großen drei (Dtor, Copy-Ctor und op=).

    PPS: Wenn dein Array immer 4 Byte groß ist, mußt du es nicht dynamisch anlegen.



  • source ist privat, aber in getSourceAdress() hast du seinen Inhalt nach source kopiert (und das lebt außerhalb deines Objekts) - d.h. du kannst dein letztes Byte dort auslesen.

    Wie würde aber ein Aufruf der Funktion getSourceAddress ausschauen?

    PS: Ich hoffe, die Klasse hat auch die großen drei (Dtor, Copy-Ctor und op=).

    Ist alles da. Danke für den Hinweis :0)

    PPS: Wenn dein Array immer 4 Byte groß ist, mußt du es nicht dynamisch anlegen.

    Eigentlich nicht immer. 4 Byte bei IPv4 und 16 Byte bei IPv6. Damit es übersichtlich bleibt, habe ich hier den zweiten Fall nicht erwähnt.



  • cpplinux schrieb:

    source ist privat, aber in getSourceAdress() hast du seinen Inhalt nach source kopiert (und das lebt außerhalb deines Objekts) - d.h. du kannst dein letztes Byte dort auslesen.

    Wie würde aber ein Aufruf der Funktion getSourceAddress ausschauen?

    Etwa so:

    char adress[4];
    ep.SourceAdress(adress);
    cout<<adress[3]<<endl;
    

    PS: Ich würde die nackte Speicherverwaltung ganz weglassen (außer du hast es sehr eilig) und mit std::string oder std::vector<char> arbeiten.



  • PS: Ich würde die nackte Speicherverwaltung ganz weglassen (außer du hast es sehr eilig) und mit std::string oder std::vector<char> arbeiten.

    Kann ich nicht weglassen, weil es eigentlich eine Bibliothek ist. Ich möchte bloss dieses verd****** letzte Byte lesen.

    Ich habe es so probiert:

    END_POINTS endp(10, 149, 49, 49, 10, 149, 49, 55);
    uint8_t* address;
    address = new uint8_t[4];							
    endp.getSourceAddress(address);
    
    cout<<"address[0]   "<<address[0]<<endl;
    cout<<"address[1]   "<<address[1]<<endl;
    cout<<"address[2]   "<<address[2]<<endl;
    cout<<"address[3]   "<<address[3]<<endl;
    

    Aber an Stelle von 10 , 149 , 49 , 49 kriege ich

    address[0]   1
    address[1]   1
    address[2]   ?
    address[3]
    

    Bin ich zu blöd 😕

    Mit char address[4] habe ich das bekommen

    invalid conversion from 'char*' to 'uint8_t*'
    


  • uint8_t müsste ein typedef auf unsigned char sein, oder? Wenn ja, gibt cout das als ASCII-Zeichen aus und du müsstest die Werte nach int casten, wenn du den Zahlenwert brauchst.

    PS: Ist es übrigens Absicht, daß die Bytes rückwärts eingetragen werden? Dein "letztes Byte" landet in src[0] und das erste Byte (10) in src[3].


  • Mod

    cpplinux schrieb:

    PPS: Wenn dein Array immer 4 Byte groß ist, mußt du es nicht dynamisch anlegen.

    Eigentlich nicht immer. 4 Byte bei IPv4 und 16 Byte bei IPv6.

    Ein union ist in diesem Falle wahrscheinlich effizienter sowohl hinsichtlich Laufzeit als auch Speicherverbrauch und macht weniger Probleme in anderer Hinsicht.



  • Mit Casten habe ich die richtigen Werte bekommen

    cout<<"address[0]  = "<<(int) address[0]<<endl;
    

    PS: Ist es übrigens Absicht, daß die Bytes rückwärts eingetragen werden? Dein "letztes Byte" landet in src[0] und das erste Byte (10) in src[3].

    Ich weiss nicht, ob es absichtlich gemacht wurde, aber du hast recht, ich brauche das erste Element vom Array und nicht das letzte.

    Danke Moderator! Programmieren ist wirklich eine schöne Sache....wenn man sie kann 😉


Anmelden zum Antworten