C шестнадцатеричное преобразование в указатель на символ - PullRequest
0 голосов
/ 28 мая 2018

Итак, у меня есть кусок кода, который в основном должен преобразовать первый байт IP-адреса, указанного в u_int32 (или hex) в символ *.Например, для 192.168.10.49 ( 0x31 0x0a 0xa8 0xc0 ) должно возвращаться 192 ( 0xc0 ).IP-адрес указывается в порядке байтов в сети.Я написал фрагмент кода, который работает, однако я не понимаю, как и почему он работает как есть.

struct sockaddr_in *addr = (struct sockaddr_in *) malloc(sizeof(addr));
unsigned char *ip_str;
int i = 0;

/* cast sockaddr to sockaddr_in. ip is given as an argument of sockaddr */
addr = (struct sockaddr_in*) ip;

/* cast address */
ip_str = (char *) &(addr->sin_addr.s_addr);

printf("addr: %02x\n", addr->sin_addr.s_addr);
printf("ip_str: %02x\n", (int) (*ip_str));

В этом фрагменте кода я даю структуру sockaddr, которая содержит IP-адрес всетевой порядок байтов, а затем я приведу его к структуре sockaddr_in.И, наконец, я преобразую свой IP-адрес в формате u_int32 в указатель на символ и получаю результат 192 (учитывая, что ip равен 192.168.10.49 ).Первая функция printf печатает IP в шестнадцатеричном формате, и его вывод:

310aa8c0

Второй, результат, печатается как:

c0

Однако, если я преобразую из сетевого порядка байтов в порядок байтов хоста (используя ntohl () ), я получу результат:

c0a80a31

И второй выводит:

31

И мой вопрос, как работает этот актерский состав?Почему он преобразуется в последний байт IP-адреса?Любые ссылки на какие-то учебники об этом или ссылки на книги приветствуются.

1 Ответ

0 голосов
/ 28 мая 2018

Порядок байтов в сети имеет порядок байтов, и, очевидно, порядок байтов в вашем хосте имеет порядок байтов.Поэтому строка байтов переворачивается с использованием ntohl.

. Обратите внимание, что в

printf("ip_str: %02x\n", (int) (*ip_str));

ip_str указатель на unsigned char.Разыменование возвращает первый байт в ip_str.

Теперь вы удивляетесь, почему выводится первый, а не последний байт.Это именно из-за порядка байтов.В памяти ваш четырехбайтовый ip_str имеет формат с прямым порядком байтов, т. Е. Младший значащий байт сохраняется как первый .Таким образом, если вы получаете доступ к этой четырехбайтовой строке не полностью, а только с помощью первого байта, вы фактически получаете доступ к последнему байту.

...