Ранее я опубликовал, как реализовать функцию, которая преобразует целое число в строку IP-адреса. Итак, как бы мы шли наоборот, т. Е. Задали строку (154.111.23.23), которая является адресом, как мы можем вернуть это целое число, не используя функции inet.IP-адрес Integer - C
ответ
сканировать строку в четыре байта и добавить/сместить их в 32-битное целое число.
//No checking of the input
unsigned int c1,c2,c3,c4;
scanf("%d.%d.%d.%d",&c1,&c2,&c3,&c4);
unsigned long ip = (unsigned long)c4+c3*256+c2*256*256+c1*256*256*256;
printf("The unsigned long integer is %lu\n",ip);
EDIT: Для тех, как заинтересованы в коде производства, GCC достаточно умен, чтобы заменить мой размножению 256 с изменениями левых. (В моей программе я также назвал выход):
0x80483d4 <main>: lea 0x4(%esp),%ecx
0x80483d8 <main+4>: and $0xfffffff0,%esp
0x80483db <main+7>: pushl -0x4(%ecx)
0x80483de <main+10>: push %ebp
0x80483df <main+11>: mov %esp,%ebp
0x80483e1 <main+13>: push %ecx
0x80483e2 <main+14>: sub $0x34,%esp
0x80483e5 <main+17>: lea -0x14(%ebp),%eax
0x80483e8 <main+20>: mov %eax,0x10(%esp)
0x80483ec <main+24>: lea -0x10(%ebp),%eax
0x80483ef <main+27>: mov %eax,0xc(%esp)
0x80483f3 <main+31>: lea -0xc(%ebp),%eax
0x80483f6 <main+34>: mov %eax,0x8(%esp)
0x80483fa <main+38>: lea -0x8(%ebp),%eax
0x80483fd <main+41>: mov %eax,0x4(%esp)
0x8048401 <main+45>: movl $0x8048520,(%esp)
0x8048408 <main+52>: call 0x8048320 <s[email protected]>
0x804840d <main+57>: mov -0x8(%ebp),%eax
0x8048410 <main+60>: mov %eax,%edx
0x8048412 <main+62>: shl $0x8,%edx
0x8048415 <main+65>: mov -0xc(%ebp),%eax
0x8048418 <main+68>: lea (%edx,%eax,1),%eax
0x804841b <main+71>: mov %eax,%edx
0x804841d <main+73>: shl $0x8,%edx
0x8048420 <main+76>: mov -0x10(%ebp),%eax
0x8048423 <main+79>: lea (%edx,%eax,1),%eax
0x8048426 <main+82>: mov %eax,%edx
0x8048428 <main+84>: shl $0x8,%edx
0x804842b <main+87>: mov -0x14(%ebp),%eax
0x804842e <main+90>: lea (%edx,%eax,1),%eax
0x8048431 <main+93>: mov %eax,-0x18(%ebp)
0x8048434 <main+96>: mov -0x18(%ebp),%eax
0x8048437 <main+99>: mov %eax,0x4(%esp)
0x804843b <main+103>: movl $0x804852c,(%esp)
0x8048442 <main+110>: call 0x8048330 <[email protected]>
0x8048447 <main+115>: movl $0x0,(%esp)
0x804844e <main+122>: call 0x8048340 <[email protected]>
POSIX.1-2001 обеспечивает inet_pton()
для выполнения этой задачи. Существует также несколько версий ms-windows.
uint32_t getDecimalValueOfIPV4_String(const char* ipAddress)
{
uint8_t ipbytes[4]={};
int i =0;
int8_t j=3;
while (ipAddress+i && i<strlen(ipAddress))
{
char digit = ipAddress[i];
if (isdigit(digit) == 0 && digit!='.'){
return 0;
}
j=digit=='.'?j-1:j;
ipbytes[j]= ipbytes[j]*10 + atoi(&digit);
i++;
}
uint32_t a = ipbytes[0];
uint32_t b = (uint32_t)ipbytes[1] << 8;
uint32_t c = (uint32_t)ipbytes[2] << 16;
uint32_t d = (uint32_t)ipbytes[3] << 24;
return a+b+c+d;
}
Надеюсь, это поможет. Наслаждаться !! –
Добавьте объяснение с помощью кода. – Sandeep
Вы инициализируете массив для хранения ваших байтов с нулями. Вы пересекаете строку ip и каждую цифру, с которой вы сталкиваетесь, умножается на 10, если в одном и том же блоке все еще есть цифры (в пунктирной нотации) i.e перед точкой (.) [Это эквивалентно левому shif (x2) в двоичном формате]. Остальная часть кода просто применяет правильный сдвиг вправо к целочисленному значению каждого блока. –
- 1. C++ Integer [?]
- 2. C/C++ Integer Операция
- 3. Integer преобразования в C#
- 4. C++ Integer Concatenation
- 5. Integer * float =? в C
- 6. C Программирование integer
- 7. c sizeof integer выравнивание?
- 8. Integer ошибка C
- 9. C++ integer from string
- 10. Указатель массива + Integer (C++)
- 11. C++ Thread Safe Integer
- 12. C# Integer список решение
- 13. C++, Integer Overflow?
- 14. Integer массива В C
- 15. c - integer downcast
- 16. Haskell types [Integer-> Integer]
- 17. OpenCV C++ Mat to Integer
- 18. C++ MurmurHash3: как hash integer
- 19. Integer факторизации в языке C
- 20. C# Integer синтаксический анализ/сравнение
- 21. C# draw bitmap from integer
- 22. Объявите Big Integer в C++
- 23. Reverse Integer Catch overflow C++
- 24. C# send integer to python
- 25. C++ sum char и integer
- 26. unsigned integer, переполненный в c
- 27. C getopt - <integer>
- 28. C++ Integer Array Palindrome Checker
- 29. Integer в SDL_JoystickName в C++
- 30. Как очистить() integer в C++
Предыдущий вопрос здесь: http://stackoverflow.com/questions/1680365/integer-to-ip-address-c –
Вы действительно должны взять время и думать об этом, прежде чем спросить. –