![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Такая проблема: Нужно разбить строку и записать ее в пять переменных Приблизительно так: Строка например: 192.168.1.101:27015 Например объявлены пять переменных (octetIP1 octetIP2 octetIP3 octetIP4 Port) и строку надо записать следующим образом что бы: octetIP1 = 192 octetIP2 = 168 octetIP3 = 1 octetIP4 = 101 Port = 27015 Перекопал много инфы и ничего не нашел. Проблема в том что IPадрес будет всегда разный и за ранее мне не известен. Подскажите пожалуйста как можно решить задачу? |
|
#2
|
||||
|
||||
|
1) Регекспы.
2) Pos, PosEx, Copy. Ищем первую точку, копируем все до нее, делаем StrToInt, затем ищем следующую точку, и т.д. 3) В лоб: Код:
var data:array[0..4] of integer;
...
j := 0;
for i := 0 to 4 do
data[i] := 0;
for i := 1 to length(str) do
begin
if (str[i] >= '0') and (str[i] <= '9')
data[j] := data[j] * 10 + ord(str[i]) - 48;
else if (str[i] = '.') or (str[i] = ':')
begin
j := j + 1;
if (j > 4)
break; // или сообщение об ошибке
end;
else
break; // или сообщение об ошибке
end;![]() Первые 4 элемента массива будут IP, пятый - порт. З.Ы. Кстати, если это связано с предыдущим постом - зачем сначала все собирать в строку, а потом парсить назад в числа? Последний раз редактировалось Bargest, 12.11.2013 в 19:13. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Shaft (12.11.2013)
| ||
|
#3
|
||||
|
||||
|
Неужели действительно "ничего не нашёл"?
Код:
var
ip: string;
octetIP1, octetIP2, octetIP3, octetIP4, Port: Integer;
begin
ip := '192.168.1.101:27015';
octetIP1 := StrToInt(copy(ip,1,pos('.',ip)-1));
delete(ip,1,pos('.',ip));
octetIP2 := StrToInt(copy(ip,1,pos('.',ip)-1));
delete(ip,1,pos('.',ip));
octetIP3 := StrToInt(copy(ip,1,pos('.',ip)-1));
delete(ip,1,pos('.',ip));
octetIP4 := StrToInt(copy(ip,1,pos('.',ip)-1));
delete(ip,1,pos('.',ip));
Port := StrToInt(ip);
end;Последний раз редактировалось PhoeniX, 12.11.2013 в 19:12. |
| Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Shaft (12.11.2013)
| ||
|
#4
|
|||
|
|||
|
Спасибо! а если не сложно можно не большой примерчик пжл?
P.S. Я создаю свой Master Server, в предыдущей теме я пытался имитировать клиент игры и отправлял запросы на Официальный Master, мне нужно было принять ответ и полностью расшифровать его, что бы я потом мог сам отправлять эти ответы в правильном виде. |
|
#5
|
|||
|
|||
|
Ну не то что бы совсем ничего, для моего случая не могу найти(
Спасибо! Буду пробовать |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Цитата:
Вот где тут парсинг строки? |
|
#8
|
||||
|
||||
|
Кстати да. Первый вопрос надо задавать не "как?" на форуме, а "нафига?" самому себе
![]() |
|
#9
|
|||
|
|||
|
У них там алгоритм какой то замудренный, даже я со своими знаниями сделал бы намного проще.
У них обязательный формат ответа: начало FF FF FF FF 66 0A потом First octet of IP address Second octet of IP address Third octet of IP address Fourth octet of IP address Port number https://developer.valvesoftware.com/...Query_Protocol Я уже пробовал отправить фиксированный ответ игре, она его приняла и правильно обработала, но не хотелось бы каждый раз добавлять серверы перекомпиляцией программы, вот делаю чтение из файла P.S. Valve последним патчем почти все переделали, теперь серверы не могут сами добавляться в мастер сервер, инфа на сайте старая, фактически немного не так, даже звуковой кодек для связи по микрофону поменяли. Последний раз редактировалось Shaft, 12.11.2013 в 19:48. |
|
#10
|
||||
|
||||
|
То-есть парсинг - для чтения списка из файлов? Ну, тогда понятно. Хотя всё равно не ясно, как эти сервера туда будут добавляться. Если автоматически или другой программой - то проще и правильнее использовать типизированные файлы. Если вручную - то оправдано.
|
|
#11
|
|||
|
|||
|
Я хочу в TStringList добавлять из файла все серверы которые в нем записаны в столбик в формате IP:PORT
Этот IP:PORT обязательно разобрать на части пробовал отправить в строчку IP:PORT но игра меня посылает в "лес" Принимает только по частям P.S. серверы после последнего патча добавляются только в ручную администратором мастер-серверов Последний раз редактировалось Shaft, 12.11.2013 в 20:07. |
|
#12
|
||||
|
||||
|
разделить "ip : port" на "ip" и "port" можно через WinHttpCrackUrl. разделить "ip":
Код:
uses
WinSock,
var
ip: DWORD;
begin
ip:=inet_addr('192.168.1.101');
Memo1.Lines.Add(IntToStr((ip shr 24) and $ff));
Memo1.Lines.Add(IntToStr((ip shr 16) and $ff));
Memo1.Lines.Add(IntToStr((ip shr 8) and $ff));
Memo1.Lines.Add(IntToStr((ip shr 0) and $ff));
end;Последний раз редактировалось NumLock, 12.11.2013 в 20:47. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Shaft (13.11.2013)
| ||
|
#13
|
||||
|
||||
|
Простите, не сдержался
![]() ![]() |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Bargest (13.11.2013)
| ||
|
#14
|
||||
|
||||
|
Код:
uses
WinSock, WinInet,
...
var
URL: String;
lpUrlComponents: TURLComponents;
lpszHostName: array [0..$1f] of Char;
dwURL: Integer;
begin
URL:='192.168.1.101:27015';
ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents));
lpUrlComponents.dwStructSize:=SizeOf(TURLComponents);
lpUrlComponents.lpszHostName:=@lpszHostName[0];
lpUrlComponents.dwHostNameLength:=Length(lpszHostName);
if InternetCrackUrl(PChar('http://'+URL), 7+Length(URL), ICU_DECODE, lpUrlComponents) then
begin
dwURL:=inet_addr(@lpszHostName[0]);
if dwURL=INADDR_NONE then RaiseLastOSError;
// out
Memo1.Lines.Add(IntToStr((dwURL shr 0) and $ff));
Memo1.Lines.Add(IntToStr((dwURL shr 8) and $ff));
Memo1.Lines.Add(IntToStr((dwURL shr 16) and $ff));
Memo1.Lines.Add(IntToStr((dwURL shr 24) and $ff));
Memo1.Lines.Add(':');
Memo1.Lines.Add(IntToStr(lpUrlComponents.nPort));
// out
end else RaiseLastOSError;
end;Последний раз редактировалось NumLock, 13.11.2013 в 09:04. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Shaft (13.11.2013)
| ||
|
#15
|
|||
|
|||
|
Спасибо ребят! Благодаря вашим примерам проблему решил, все работает.
|