Страница 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, убери/замени все нули циклом, а потом работай как с обычной строкой.