Как изменить адрес ip в гексе? - PullRequest
0 голосов
/ 10 января 2019

Я показываю IP адреса некоторых узлов сети с помощью сетевого симулятора, но у меня нет ожидаемого результата.

Я отображаю IP-адрес с помощью этой функции:

void print_hex_src_adress(uint8_t *s, size_t len)
{
    printf("  ID=");
    for(int i=0; i< len; i++) {
        printf("%02x", s[i]);
    }
}

Затем для отображения адреса я поставил:

open_addr_t * myaddress;
myaddress = idmanager_getMyID(ADDR_64B);
print_hex_src_adress(myadress, 16);

Но результат, который я имею, не является ожидаемым результатом:

  ID=02141592cc0000000400000093947ae2

ожидаемый результат:

  ID=02141592cc0000000400000000000000

1 Ответ

0 голосов
/ 10 января 2019

idmanager_getMyID возвращает указатель на объединение типа open_addr_t. Объединение - это объект, достаточно большой, чтобы содержать любое из полей, которые он может содержать. Это не значит, что все данные в нем будут инициализированы. Вы запрашиваете ADDR_64B, что означает, что только первые 64 бита или 8 байтов объединения могут быть инициализированы через поле addr_64b.

В действительности происходит то, что вы вызываете неопределенное поведение, пытаясь напечатать байты, содержащие значения мусора. Хорошей новостью является то, что вы не столкнетесь с памятью, которую вы не можете использовать, потому что объединение составляет не менее 16 байтов. Вы ожидаете, что мусор будет нулем, но вместо этого вы получите настоящий мусор. У вас есть два варианта:

  1. Выведите на самом деле запрошенные вами байты:

    print_hex_src_adress(myadress.addr_64b, sizeof(myadress.addr_64b));
    

    Использование sizeof для чего-то подобного - хорошая привычка. Структуры и объединения могут меняться между версиями, но написание этого кода делает ваш код устойчивым к таким изменениям.

  2. Запросить байты, которые вы на самом деле хотите:

    myaddress = idmanager_getMyID(ADDR_128B);
    

    По-прежнему обращайтесь к правильному полю при печати и не слишком жестко кодируйте размер:

    print_hex_src_adress(myadress.addr_128b, sizeof(myadress.addr_128b));
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...