Dodatnie adresu IP w postaci zmiennej integer

0

Cześć, chciałbym do obiektu typu QByteArray dodać adres IP - adres jest w formie zmiennej quint32, uzyskanego za pomocą metody QHostAddress::toIPv4Address(bool *ok = nullptr). Jak najlepiej to zrobić? Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

0

Możesz konwertować lub zmienić interpretację, raczej będzie trzeba skopiować do tego QByteArray, można użyć np. jakiejś przeładowanej operacji append(const char*, len),
teraz uint32, możesz sobie wziąć adres gdzie jest położony czyli referencję, a potem tą referencję zrzutować na const char*, ewentualnie możesz sobie zrobić union.

union type_a {
  quint32 i;
  unsigned char arr[sizeof(i)] ;
}

I teraz jak sobie przypiszesz wartość do Union, to masz jednocześnie i zmienną uint32 i tablicę bajtów, oczywiście to tylko interpretacja tych danych.

0
haracz napisał(a):

Cześć, chciałbym do obiektu typu QByteArray dodać adres IP - adres jest w formie zmiennej quint32, uzyskanego za pomocą metody QHostAddress::toIPv4Address(bool *ok = nullptr). Jak najlepiej to zrobić? Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

Ja bym zrobił tak

QHostAddress addr;
addr.setAddress("172.29.0.11");

QByteArray arrayAddr;
arrayAddr = addr.toString().toLocal8Bit();

qInfo()<< arrayAddr;
1
zkubinski napisał(a):
haracz napisał(a):

Cześć, chciałbym do obiektu typu QByteArray dodać adres IP - adres jest w formie zmiennej quint32, uzyskanego za pomocą metody QHostAddress::toIPv4Address(bool *ok = nullptr). Jak najlepiej to zrobić? Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

Ja bym zrobił tak

QHostAddress addr;
addr.setAddress("172.29.0.11");

QByteArray arrayAddr;
arrayAddr = addr.toString().toLocal8Bit();

qInfo()<< arrayAddr;

Byłeś pan łaskaw nie przeczytać pytania / dokumentacji QHostAddress w zakresie użytej metody / nie zrozumieć materii ani w ząb
temu panu już dziękujemy.

0
zkubinski napisał(a):
haracz napisał(a):

Cześć, chciałbym do obiektu typu QByteArray dodać adres IP - adres jest w formie zmiennej quint32, uzyskanego za pomocą metody QHostAddress::toIPv4Address(bool *ok = nullptr). Jak najlepiej to zrobić? Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

Ja bym zrobił tak

QHostAddress addr;
addr.setAddress("172.29.0.11");

QByteArray arrayAddr;
arrayAddr = addr.toString().toLocal8Bit();

qInfo()<< arrayAddr;

Tylko pytanie czy obiekt arrayAddr typu QByteArray nie zajmowałby więcej miejsca niż zwykła tablica char. Zastanawiam się czy nie użyć funkcji typu sprintf.
Nawet jakbym miał zaoszczędzić kilka bajtów to chyba warto.

1

@haracz:

haracz napisał(a):

Tylko pytanie czy obiekt arrayAddr typu QByteArray nie zajmowałby więcej miejsca niż zwykła tablica char. Zastanawiam się czy nie użyć funkcji typu sprintf.
Nawet jakbym miał zaoszczędzić kilka bajtów to chyba warto.

Chrzanić oszczędności czy nie-oszczędnosci, ale zastanów się nad specyfikacją i co sam chcesz, co naprawdę jest celem, bo się miotasz.

Przechowywanie jako 4 bajty (pominę niedopowiedzenie LSB / MSB, co tez jest wazne) moze mieć znaczenie o ile w dalszym użyciu będzie tak potrzebne. A odwrotnie, jeśli główną intencją będzie oglądanie przez człowieka

Po drugie, obiektów C++ praktycznie zawsze nie da się bezpiecznie / stabilnie przechowywać na zasadzie binarnej, obawiam się że nie czujesz tego.

Po trzecie (zw z pierwszym) oszczędność kilku bajtów (poza mikrokontrolerami 8/16 bit) nie ma sensu, jeśli nieustannie tłuczesz CPU i alokowany czasowo RAM podczas konwersji

haracz napisał(a):

Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

Dodał bym, jedną z patologii starszych jezyków, czyli Pasali, C i pochodnych, jest totalny miszung char / byte.
Zgubisz się jak ciotka w lesie, jak nie będzie mocno odróżniał w głowie.
To nic, że pewnych lokalnych kontekstach to jest to samo, ale koncepcyjnie jest głęboko różne.

0
ZrobieDobrze napisał(a):

@haracz:

haracz napisał(a):

Tylko pytanie czy obiekt arrayAddr typu QByteArray nie zajmowałby więcej miejsca niż zwykła tablica char. Zastanawiam się czy nie użyć funkcji typu sprintf.
Nawet jakbym miał zaoszczędzić kilka bajtów to chyba warto.

Chrzanić oszczędności czy nie-oszczędnosci, ale zastanów się nad specyfikacją i co sam chcesz, co naprawdę jest celem, bo się miotasz.

Przechowywanie jako 4 bajty (pominę niedopowiedzenie LSB / MSB, co tez jest wazne) moze mieć znaczenie o ile w dalszym użyciu będzie tak potrzebne. A odwrotnie, jeśli główną intencją będzie oglądanie przez człowieka

Po drugie, obiektów C++ praktycznie zawsze nie da się bezpiecznie / stabilnie przechowywać na zasadzie binarnej, obawiam się że nie czujesz tego.

Po trzecie (zw z pierwszym) oszczędność kilku bajtów (poza mikrokontrolerami 8/16 bit) nie ma sensu, jeśli nieustannie tłuczesz CPU i alokowany czasowo RAM podczas konwersji

haracz napisał(a):

Czy muszę przekonwertować to na tablicę char i dopiero dodać do QByteArray?

Dodał bym, jedną z patologii starszych jezyków, czyli Pasali, C i pochodnych, jest totalny miszung char / byte.
Zgubisz się jak ciotka w lesie, jak nie będzie mocno odróżniał w głowie.
To nic, że pewnych lokalnych kontekstach to jest to samo, ale koncepcyjnie jest głęboko różne.

Może doprecyzuję. Chciałbym ten adres IP dodać do datagramu wysyłanego przez internet. Odbiorca datagramu miałby podjąć akcję w zależności od ostatnich powiedzmy 4 bajtów datagramu zawierającego ten adres.

1
haracz napisał(a):

Może doprecyzuję. Chciałbym ten adres IP dodać do datagramu wysyłanego przez internet. Odbiorca datagramu miałby podjąć akcję w zależności od ostatnich powiedzmy 4 bajtów datagramu zawierającego ten adres.

Oprtócz wypowiedzi @Wypierdzistyy z unią (wśrod dopuszczalnych rozwiązań, znaczną część ludzi uzna za wzorcowe) zostaje nam rzutowanie

quint32 zmienna;

usnigned char * zrobcochcesz = (usigned char *)(&zmienna); 


...
memcpy(somewhereInDatagram, zrobielemcochcę, 4)

(nie kompilowane)

0
haracz napisał(a):

Może doprecyzuję. Chciałbym ten adres IP dodać do datagramu wysyłanego przez internet. Odbiorca datagramu miałby podjąć akcję w zależności od ostatnich powiedzmy 4 bajtów datagramu zawierającego ten adres.

jednym ze zdrowych rozwiązań jest zdefiniować ramki tego tworzonego protokołu w postaci struktur zamiast jakiejś kupki bajtów (uwaga -> na granicy odmiennych architektur jak Intel / Arm / Android , a bez dodatkowych zabiegów LSB/MSB gwarantowana katastrofa)

0

chyba jest rozwiązanie, rzuć okiem na klasę QNetworkDatagram, być może dzięki tej klasie dorwiesz się do datagramu (zakładam, że to protokół UDP) i za pomocą funkcji QHostAddress destinationAddress() const wyciągniesz ten adres, nawet jeżeli go wyciągniesz, to myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

0
zkubinski napisał(a):

chyba jest rozwiązanie, rzuć okiem na klasę QNetworkDatagram, być może dzięki tej klasie dorwiesz się do datagramu (zakładam, że to protokół UDP) i za pomocą funkcji QHostAddress destinationAddress() const wyciągniesz ten adres, nawet jeżeli go wyciągniesz, to myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

Sęk w tym, że nie interesuje mnie adres docelowy zawarty w nagłówku datagramu. To ma być zupełnie inny adres, na podstawie którego serwer podejmie decyzję gdzie dalej przesłać datagram.

0
zkubinski napisał(a):

myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

zarówno oktet jest formatem binarnym jak i bajt, co wiecej oktet prawie zawsze jest bajtem.

Błysnąłeś jak meteor

3

Aż bolą mnie zęby jak czytam tę dyskusję. Jeśli chcesz dodać dane binarne do QByteArray to nie ma tu żadnej filozofii.

QByteArray arr;

bool ok;
quint32 addr = ip.toIPv4Address(&ok);
if (!ok) addr = 0;

arr.append(static_cast<char const*>(&addr), sizeof(addr));
0
haracz napisał(a):
zkubinski napisał(a):

chyba jest rozwiązanie, rzuć okiem na klasę QNetworkDatagram, być może dzięki tej klasie dorwiesz się do datagramu (zakładam, że to protokół UDP) i za pomocą funkcji QHostAddress destinationAddress() const wyciągniesz ten adres, nawet jeżeli go wyciągniesz, to myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

Sęk w tym, że nie interesuje mnie adres docelowy zawarty w nagłówku datagramu. To ma być zupełnie inny adres, na podstawie którego serwer podejmie decyzję gdzie dalej przesłać datagram.

czy ten adres który chcesz dodać będzie wysyłany jako dane w datagramie ? Tak wnioskuję, że chcesz go przesłać, bo jak inaczej ?

0
zkubinski napisał(a):
haracz napisał(a):
zkubinski napisał(a):

chyba jest rozwiązanie, rzuć okiem na klasę QNetworkDatagram, być może dzięki tej klasie dorwiesz się do datagramu (zakładam, że to protokół UDP) i za pomocą funkcji QHostAddress destinationAddress() const wyciągniesz ten adres, nawet jeżeli go wyciągniesz, to myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

Sęk w tym, że nie interesuje mnie adres docelowy zawarty w nagłówku datagramu. To ma być zupełnie inny adres, na podstawie którego serwer podejmie decyzję gdzie dalej przesłać datagram.

czy ten adres który chcesz dodać będzie wysyłany jako dane w datagramie ? Tak wnioskuję, że chcesz go przesłać, bo jak inaczej ?

Tak myślę. Mam chyba do wyboru tylko nagłówek albo dane.

0
haracz napisał(a):
zkubinski napisał(a):
haracz napisał(a):
zkubinski napisał(a):

chyba jest rozwiązanie, rzuć okiem na klasę QNetworkDatagram, być może dzięki tej klasie dorwiesz się do datagramu (zakładam, że to protokół UDP) i za pomocą funkcji QHostAddress destinationAddress() const wyciągniesz ten adres, nawet jeżeli go wyciągniesz, to myślę, że i tak będziesz musiał napisać własną funkcję do rozbijania tego na oktety, potem na format binarny i ostatecznie wyciągniesz 4 bajty, a potem rób se co chcesz

Sęk w tym, że nie interesuje mnie adres docelowy zawarty w nagłówku datagramu. To ma być zupełnie inny adres, na podstawie którego serwer podejmie decyzję gdzie dalej przesłać datagram.

czy ten adres który chcesz dodać będzie wysyłany jako dane w datagramie ? Tak wnioskuję, że chcesz go przesłać, bo jak inaczej ?

Tak myślę. Mam chyba do wyboru tylko nagłówek albo dane.

więc jako dane, to może spróbuj skorzystać z tej klasy i jest tam funkcja data to z niej wyciągniesz adres ale i tak ciebie nie ominie napisanie funkcji rozkładającej adres IPv4 do postaci binarnej i wybraniu 4 bajtów. To chyba tyle, no chyba, że ktoś inny ma dużo lepszy pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1