Итак, у меня есть кусок кода, который в основном должен преобразовать первый байт 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-адреса?Любые ссылки на какие-то учебники об этом или ссылки на книги приветствуются.