И снова я, получаем данные с сурс серверов

Для тех, кто хочет сделать мир лучше.
Ответить
Сообщение
Автор
Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#1 Сообщение 20.12.2008, 02:16

И снова я с проблемами. Собственно проблема в том что данные приходят, но в итоге я получаю только название сервера, как уже не пытался, выбить получаеся только название сервера, а ведь дальше еще больше 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;
        }

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#2 Сообщение 20.12.2008, 03:40

эмммм.. скорее всего это из за '\x00' каторое стоит после названия сервера
на си такая же проблема и решается просто, unsigned char*
ещё можно вручную из байт в стринг конвертнуть, без использования энкодинга

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2598
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 43 раза
Контактная информация:

#3 Сообщение 20.12.2008, 10:19

Megalan, у самого была подобная хрень
проблема заключается в байте x00

посмотри код стим листа, там показано как работать с нулями и как разделять информацию используя в качестве разделителя ноль

парвда у меня код на C++

Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#4 Сообщение 20.12.2008, 15:05

к сожалению ничего полезного в последних 2 постах для себя не увидел. В коде steam list используются те же unsigned'ы, которых в c# нет :(

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#5 Сообщение 20.12.2008, 15:31

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]);
}

Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#6 Сообщение 20.12.2008, 15:42

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 не нашел

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#7 Сообщение 20.12.2008, 18:11

может это папробуеш 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();
        }

Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#8 Сообщение 21.12.2008, 16:40

Вобщем проблема решена, всем спасибо, все свободны :)

Griefff
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 24.12.2010

#9 Сообщение 24.12.2010, 20:58

Друзья, помогите сделать тоже самое, но на 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
Спасибо за будущую помощь.
Последний раз редактировалось Griefff 24.12.2010, 21:17, всего редактировалось 3 раза.

Griefff
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 24.12.2010

#10 Сообщение 26.12.2010, 21:38

Всё ещё интересно узнать ответ! Подскажите что делать. Может есть какой-то кардинально другой способ. Может существует другая функция преобразования входных данных в строку, который позволяет удалить этот нулевой байт или удалить его из получаемых данных ещё ни во что не преобразованных? Помогите найти способ, очень нужно реализовать данный проект))

IXLive
Нович0к
Нович0к
Сообщения: 1
Зарегистрирован: 14.02.2011

#11 Сообщение 14.02.2011, 06:45

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

Ответить