Понедельник, 25 Ноября 2024, 09:44

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Строку в бинарный вид.
FenrireДата: Понедельник, 14 Ноября 2011, 22:09 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Всем привет! И это снова я))
Сложилась следующая ситуация:
Требуется передать на сервер строку. Соединяемся через сокеты. С этим все просто. Но вот стал вопрос о том, как передать на сервер строку в бинарном виде по следующей схеме:
2 байта = тип запроса;
2 байта = длинна строки;
остальное непосредственно сама строка.

Нашел и успешно скурил следующую статью: Статья

Из предоставленного в статье класса нагло стырил последнюю функцию, которая переводит строку в бинарный вид. Тем, кому лень читать полностью статью привожу ниже код:
Code

  public static function toByteArray(str:String):ByteArray  
     {
       if (str.length % 2 != 0) return null;
   
       var ba:ByteArray = new ByteArray();
   
       for (var i:int = 0; i < str.length; i += 2) {
         var num:int = parseInt("0x" + str.substr(i, 2));
         ba.writeByte(num);
       }
   
       ba.position = 0;
       return ba;
     }


Пробую собрать строку вручную. Отправляю на сервер:
Code

var test:ByteArray = toByteArray("1234");
     
    try
    {
     socket.send(test + "\n");
    }


Приходит, как и положено: 12 34
Теперь собираю строку по тому принципу, который нужен мне, опять-таки вручную:

Code
var test:ByteArray = toByteArray("00010006LALALA");


где 0001 по идее должно ложиться в первые 2 байта и обозначать тип запроса 0006 - количество байт в сообщении и LALALA - сообщение.
на сервер принимаю: 01 06 00 0 a0 последнее - перенос строки и нулевой байт.

Я понимаю, что возможно вообще не в те дебри полез... Может быть, вы поможете разобраться в этом и направите на путь истины?))
За ранее благодарен)
0x90Дата: Вторник, 15 Ноября 2011, 09:27 | Сообщение # 2
участник
Сейчас нет на сайте
Приведу пример на С++ того, что должно получиться:
Code

/* в аs3 нет двухбайтовых переменных,
поэтому и здесь я упаковываю два short`a
в один int
*/
class q_head
{
public:
  void set_param(unsigned short a,unsigned short b)
  {
   param = a;
   param <<= 16;
   param |= b;  
  }
private:
  int param;  
};

class q_some_query
{
  q_some_query()
  {
   head.set_param(some_type,sizeof(some_buffer));
  }
  q_head head;
  char somebuffer[some_size];
};

/* Знаю, что отправлять классы-изврат,  
в С я мог бы отправить структуру, но в
as3 их нет */
q_some_query query;
send(socket,(char*)query,sizeof(query),0);

Вот что-то подобное нужно реализовать на as3.
noTformaTДата: Вторник, 15 Ноября 2011, 15:12 | Сообщение # 3
Ukrainian independent game developer
Сейчас нет на сайте
ммм, тебе надо засунуть в массив байт 4 нужные тебе байта? ByteArray.writeByte(нужные байты), а далее засунь каждый символ из строки в массив байтов smile

@noTformaT
FenrireДата: Вторник, 15 Ноября 2011, 16:39 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Quote (noTformaT)
ммм, тебе надо засунуть в массив байт 4 нужные тебе байта? ByteArray.writeByte(нужные байты), а далее засунь каждый символ из строки в массив байтов


Вот, как раз пробуем этот метод.
Только writeByte пишет только один байт, а создавать 4 переменных и разделять число геморно, пробую следующее:
writeShort()

вот кусок:
Code

var tip:int = 0001;
    var size:int = 0013;
    var tek:String = "PREVED_MEDVED";
     
     
    var test:ByteArray = new ByteArray();
    test.writeShort(tip);
    test.writeShort(size);
    test.writeUTF(tek);


но почему-то значение size приходит 2 раза

Добавлено (15.11.2011, 16:39)
---------------------------------------------
Решение найдено.
проблема была тут: test.writeUTF(tek);
writeUTFBytes(); передает корректное количество байт.
Спасибо!

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг