Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> байты в число (IP в число) 
:(
    Опции темы
AlexP11223
Дата 20.1.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



А как в Паскале (fpc) преобразовать несколько байтов в одно число? Допустим IP адрес т.е. строку вида 178.70.100.8 в одну переменную типа ...э...longint? или integer?  
В Си/С++ можно как-то так:
немного коряво, но смысл вроде понятен, собственно основная проблема с тем, что после второго комментария
Код
    // string to bytes
    char strtype[4];
    string a = "110.70.10.90";
    string buf = a.substr(0, a.find("."));
    strtype[0] = atoi(buf.c_str());
    a.erase(0, a.find(".") + 1);
    buf = a.substr(0, a.find("."));
    strtype[1] = atoi(buf.c_str());
    a.erase(0, a.find(".") + 1);
    buf = a.substr(0, a.find("."));
    strtype[2] = atoi(buf.c_str());
    a.erase(0, a.find(".") + 1);
    strtype[3] = atoi(a.c_str());

    // bytes to int
    unsigned int ip = (strtype[0]<<24)|(strtype[1]<<16)|(strtype[2]<<8)|strtype[3];
    cout << ip; 

PM WWW Skype   Вверх
Vas
Дата 21.1.2012, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: нет
Всего: 28



Не мое, когда то тоже искал, вот что нашел в сети
Код

Function IpToInt(ip: string): dword; // превращаем IP в число, требует модуль WinSock
  Function RemChar(const AStr: string): string;
  var i: integer;
  Begin
    Result:='';
    for i:=1 to Length(AStr) do
      if AStr[i] in ['0'..'9','.'] then
        Result:=Result+AStr[i];
  End;
var OrgIP:string;
begin
  OrgIP:=RemChar(ip);
  result := inet_addr(PChar(OrgIP));
  result := (result shl 24) or (result and $FF00 shl 8) or
            (result and $FF0000 shr 8) or (result shr 24);
End;

Function IntToIP(ip_num: dword): string; // превращаем число в IP
var OrgIP:TInAddr;
    IP:string;
Begin
  OrgIp.S_addr:=ip_num;
  //Result:=IntToStr(ip_num div 256/256/256)+'.'+IntToStr((ip_num div 256*256*256)/256/256)+'.'+IntToStr((ip_num div 256*256)/256))+'.'+IntToStr(ip_num div 256);
  IP:=inet_ntoa(OrgIP);
  Result:=Trim(Copy(IP,1,Pos('.',IP)-1));
  Delete(IP,1,Pos('.',IP));
  Result:=Trim(Copy(IP,1,Pos('.',IP)-1))+'.'+Result;
  Delete(IP,1,Pos('.',IP));
  Result:=Trim(Copy(IP,1,Pos('.',IP)-1))+'.'+Result;
  Delete(IP,1,Pos('.',IP));
  Result:=Trim(IP)+'.'+Result;
End;

Function IP2HEX(OrgIP:string):Real;  // превращаем IP в число
var
  // Сохраняем оригинальное значение IP адреса
  OrgVal: string;
  // части оригинального IP
  O1,O2,O3,O4: string;
  // шестнадцатиричные части
  H1,H2,H3,H4: string;
  // Здесь будут собраны все шестнадцатиричные части
  HexIP: string;
  XN: array[1..8] of Extended;
  Flt1: Extended;
  Xc: Integer;
Begin
  // Сохраняем в обратном порядке для простого случая
  Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);
  Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);
  // Сохраняем оригинальный IP адрес
  OrgVal:=OrgIP;
  O1:=Trim(Copy(OrgVal,1,Pos('.',OrgVal)-1));
  Delete(OrgVal,1,Pos('.',OrgVal));
  O2:=Trim(Copy(OrgVal,1,Pos('.',OrgVal)-1));
  Delete(OrgVal,1,Pos('.',OrgVal));
  O3:=Trim(Copy(OrgVal,1,Pos('.',OrgVal)-1));
  Delete(OrgVal,1,Pos('.',OrgVal));
  O4:=Trim(OrgVal);
  try
    H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);
    H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);
    // Получаем шестнадцатиричное значение IP адреса
    HexIP:=H1+H2+H3+H4;
    // Преобразуем это большое шестнадцатиричное значение в переменную Float
    Flt1:=0;
    for Xc:=1 to 8 do
    begin
      case HexIP[Xc] of
        '0'..'9': Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);
        'A': Flt1:=Flt1+(10*Xn[Xc]);
        'B': Flt1:=Flt1+(11*Xn[Xc]);
        'C': Flt1:=Flt1+(12*Xn[Xc]);
        'D': Flt1:=Flt1+(13*Xn[Xc]);
        'E': Flt1:=Flt1+(14*Xn[Xc]);
        'F': Flt1:=Flt1+(15*Xn[Xc]);
      end;
    end;
    Result:=Flt1;
  except
    Result:=-1;
  end;
End;



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
jsat
Дата 10.4.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.4.2012

Репутация: нет
Всего: нет



ребята тоже интересуюсь функции IP адрес в число и наоборот. В С++ Builder (winsock2) есть функция inet_addr("192.168.20.153"), который адрес переводить в число. Но чтобы это функция правильно сработало на ip адрес надо наоборот inet_addr("153.20.168.192"). Но как сделать этот адрес наоборот затрудняюсь, пока новичок.  В делфи что означает if AStr[i] in ['0'..'9','.'] then
PM MAIL   Вверх
volvo877
Дата 12.4.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



jsat, Поскольку это - раздел о кроссплатформенном программировании - то в FPC есть модуль Sockets, который содержит функцию StrToNetAddr, конвертирующую адрес, заданный в виде строки, в беззнаковое 32-байтное число. Почему оно "наоборот" - объяснено в MSDN: 
Цитата
When an Internet address is viewed as a 32-bit integer quantity on the Intel architecture, the bytes referred to above appear as "d.c.b.a''. That is, the bytes on an Intel processor are ordered from right to left.
, на других процессорах может быть по-другому.

Для того, чтобы всегда иметь возможность переконвертировать из локального порядка байт в сетевой (сетевой - всегда big-endian), тот же модуль Sockets предоставляет функцию HostToNet (есть и обратные, см. ниже по ссылкам).

Т.е., 
Код
Uses Sockets; 
// ...
writeln(HostToNet(StrToNetAddr('127.0.0.1')).s_addr);
, откомпилированный под Windows на Intel-архитектуре выведет не 16777343, а 2130706433, т.е., никаких "наоборот" не будет...

А как оно там в Дельфи - это ты у них в разделе спрашивай smile Скорее всего те же WinAPI-шные inet_addr и htonl / ntohl
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.