Страница 1 из 1
И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 02:16
Megalan
И снова я с проблемами. Собственно проблема в том что данные приходят, но в итоге я получаю только название сервера, как уже не пытался, выбить получаеся только название сервера, а ведь дальше еще больше string'ов, карта, папка игры и тд.
Вот код:
Код: Выделить всё
public string ServerInfo()
{
this.socket.SendTo(queryMagic, this.endpoint); // Отсылаем FF FF FF FF TSource Engine Query
int received = this.socket.ReceiveFrom(this.data, ref this.endpoint); // Принимаем данные
string str3 = System.Text.Encoding.Default.GetString(this.data, 0, received); // выдернули название сервера, и все :(
return str3;
}
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 03:40
eldest
эмммм.. скорее всего это из за '\x00' каторое стоит после названия сервера
на си такая же проблема и решается просто, unsigned char*
ещё можно вручную из байт в стринг конвертнуть, без использования энкодинга
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 10:19
Fire666
Megalan, у самого была подобная хрень
проблема заключается в байте x00
посмотри код стим листа, там показано как работать с нулями и как разделять информацию используя в качестве разделителя ноль
парвда у меня код на C++
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 15:05
Megalan
к сожалению ничего полезного в последних 2 постах для себя не увидел. В коде steam list используются те же unsigned'ы, которых в c# нет :(
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 15:31
eldest
Megalan писал(а):к сожалению ничего полезного в последних 2 постах для себя не увидел. В коде steam list используются те же unsigned'ы, которых в c# нет :(
не используй System.Text.Encoding
папробуй типа
Код: Выделить всё
string str = "";
for(int i = 0; i > len(bytes);i++) {
//tak
str[i] = chr(bytes[i]);
//ili tak
str = str + chr(bytes[i]);
}
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 15:42
Megalan
eldest писал(а):Megalan писал(а):к сожалению ничего полезного в последних 2 постах для себя не увидел. В коде steam list используются те же unsigned'ы, которых в c# нет :(
не используй System.Text.Encoding
папробуй типа
Код: Выделить всё
string str = "";
for(int i = 0; i > len(bytes);i++) {
//tak
str[i] = chr(bytes[i]);
//ili tak
str = str + chr(bytes[i]);
}
как я не изголялся не получилось с этим кодом.
Зато я смог получить данные в hex
Код: Выделить всё
FF-FF-FF-FF-49-07-56-49-43-54-4F-52-49-41-20-43-52-55-45-4E-54-41-20-5B-52-55-53-53-49-41-2D-4D-4F-53-43-4F-57-5D-00-64-6D-5F-6C-6F-73-74-76-69-6C-6C-61-67-65-5F-6E-6F-5F-72-70-67-00-68-6C-32-6D-70-00-54-65-61-6D-20-44-65-61-74-68-6D-61-74-63-68-00-40-01-17-18-00-64-77-00-01-31-2E-30-2E-30-2E-31-32-00
и как их теперь привести в нормальный вид?
ps сколько не искал нормальный код для работы с hex не нашел
Re: И снова я, получаем данные с сурс серверов
Добавлено: 20.12.2008, 18:11
eldest
может это папробуеш System.Text.Encoding.Unicode.GetString()?
я недавно винду переставил и мне лень ставить C#
Код: Выделить всё
взято из ирон питон IronPython
там много чего интересного для C#
public static string EncodeHex(string data) {
StringBuilder sb = new StringBuilder(data.Length * 2);
for (int i = 0; i < data.Length; i++) {
sb.AppendFormat("{0:x2}", (int)data[i]);
}
return sb.ToString();
}
public static string DecodeHex(string data) {
//if (data == null) throw Ops.TypeError("expected string, got NoneType");
//if ((data.Length & 0x01) != 0) throw Ops.ValueError("string must be even lengthed");
StringBuilder res = new StringBuilder(data.Length / 2);
for (int i = 0; i < data.Length; i += 2) {
byte b1, b2;
if (Char.IsDigit(data[i])) b1 = (byte)(data[i] - '0');
else b1 = (byte)(Char.ToUpper(data[i]) - 'A' + 10);
if (Char.IsDigit(data[i + 1])) b2 = (byte)(data[i + 1] - '0');
else b2 = (byte)(Char.ToUpper(data[i + 1]) - 'A' + 10);
res.Append((char)(b1 * 16 + b2));
}
return res.ToString();
}
Re: И снова я, получаем данные с сурс серверов
Добавлено: 21.12.2008, 16:40
Megalan
Вобщем проблема решена, всем спасибо, все свободны :)
Re: И снова я, получаем данные с сурс серверов
Добавлено: 24.12.2010, 20:58
Griefff
Друзья, помогите сделать тоже самое, но на delphi.
Пробую делать это через компонент IdUDPServer или через IdUDPClient со вкладок Indy Servers и IndyClients соответственно, также пробовал через IdChargenUDPServer/Client, работает и через и сервер и через клиент, но из-за этого пресловутого нулевого байта вся информация, записываемая в строку на нём прерывается. Как записать данные к примеру в hex, а потом уже удалив этот байт преобразовать в строку я не имею понятия. Помогите разобраться! Как я понял кроме как с помощью IdUDPServer1.ReceiveString(t) получаемые данные вытащить невозможно (t - целое, таймаут соединения).
Использую следующий код:
Код: Выделить всё
IdUDPClient1.Active:= True;
IdUDPClient1.Send(char(255)+char(255)+char(255)+char(255)+'TSource Engine Query'+Chr(0));
s:=(IdUDPClient1.ReceiveString(1000));
IdUDPClient1.Active:=False;
Перекопал весь интернет, для delphi ответа не нашёл((( Что делать? Именно на delphi
Спасибо за будущую помощь.
Re: И снова я, получаем данные с сурс серверов
Добавлено: 26.12.2010, 21:38
Griefff
Всё ещё интересно узнать ответ! Подскажите что делать. Может есть какой-то кардинально другой способ. Может существует другая функция преобразования входных данных в строку, который позволяет удалить этот нулевой байт или удалить его из получаемых данных ещё ни во что не преобразованных? Помогите найти способ, очень нужно реализовать данный проект))
Re: И снова я, получаем данные с сурс серверов
Добавлено: 14.02.2011, 06:45
IXLive
Griefff писал(а):Друзья, помогите сделать тоже самое, но на delphi.
Пробую делать это через компонент IdUDPServer или через IdUDPClient со вкладок Indy Servers и IndyClients соответственно, также пробовал через IdChargenUDPServer/Client, работает и через и сервер и через клиент, но из-за этого пресловутого нулевого байта вся информация, записываемая в строку на нём прерывается. Как записать данные к примеру в hex, а потом уже удалив этот байт преобразовать в строку я не имею понятия. Помогите разобраться! Как я понял кроме как с помощью IdUDPServer1.ReceiveString(t) получаемые данные вытащить невозможно (t - целое, таймаут соединения).
Использую следующий код:
Код: Выделить всё
IdUDPClient1.Active:= True;
IdUDPClient1.Send(char(255)+char(255)+char(255)+char(255)+'TSource Engine Query'+Chr(0));
s:=(IdUDPClient1.ReceiveString(1000));
IdUDPClient1.Active:=False;
Перекопал весь интернет, для delphi ответа не нашёл((( Что делать? Именно на delphi
Спасибо за будущую помощь.
Работай через массив char, убери/замени все нули циклом, а потом работай как с обычной строкой.