Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Char to Byte
хвостег Дата: Среда, 26.02.2014, 20:41:23 | Сообщение # 1
Сообщений: 161
Репутация: 53 [ +/- ]
Есть символ А(русская), как получить байт 1040 ?

Добавлено (26.02.2014, 20:31:32)
---------------------------------------------
даже немного не так
нужно получить все байты из символа(в данном случае это 2 байта)
для последующего преобразования в hex

Добавлено (26.02.2014, 20:41:23)
---------------------------------------------
Ну и чтобы совсем стало понятно, для чего все это нужно, я объясню.
Нужна функция httpURLencode, кто не в теме объясняю...

Пример:
До кодирования:
world source
После кодирования:
world+source
или
world%20source

С кириллицей все куда сложнее.
Нужно преобразовать символ, побайтово, в hex

Пример:
До:
ворлд сурс
После:
%D0%B2%D0%BE%D1%80%D0%BB%D0%B4+%D1%81%D1%83%D1%80%D1%81
или
%D0%B2%D0%BE%D1%80%D0%BB%D0%B4%20%D1%81%D1%83%D1%80%D1%81

 
sssw Дата: Среда, 26.02.2014, 22:42:03 | Сообщение # 2
Сообщений: 123
Репутация: 14 [ +/- ]
Я не могу это проверить но попробуй что то вроде.
Код
Test()
{
            new m_nohex[15]
            new String:test[15] = "Привет HEX";
            new String:hex[15]
           for (new i=0;i<=15;i++)
           {
                  m_nohex[i] = test[i]; //игнорируем предупреждение.
                  decl String:m_hex[15]    
                  Format(m_hex, 15,"%x", m_nohex[i]);
                  Format(hex, 15, "%s%s",hex, m_hex);            
           }
           PrintToServer(hex);
}


Сообщение отредактировал sssw - Среда, 26.02.2014, 22:46:51
 
хвостег Дата: Среда, 26.02.2014, 23:15:57 | Сообщение # 3
Сообщений: 161
Репутация: 53 [ +/- ]
Спасибо, но я уже по-своему сделал.


Сообщение отредактировал хвостег - Среда, 26.02.2014, 23:16:16
 
sssw Дата: Четверг, 27.02.2014, 00:30:38 | Сообщение # 4
Сообщений: 123
Репутация: 14 [ +/- ]
Цитата хвостег ()
Спасибо, но я уже по-своему сделал.

Углож моё любопытство.
 
хвостег Дата: Среда, 12.03.2014, 16:32:52 | Сообщение # 5
Сообщений: 161
Репутация: 53 [ +/- ]
Вот такой функ у меня получился

Код

stock String:httpURLencode(const String:URL[])
{
         new String:s_encode[1024];
                 
         new bool:invalid = false;
                 
         for(new i = 0; i < strlen(URL); i++)
         {
          new Hex = (URL[i] & 0xFF);
                  
          switch (Hex)
          {
           case 0x21 : { invalid = true; }
           case 0x22 : { invalid = true; }
           case 0x23 : { invalid = true; }
           case 0x24 : { invalid = true; }
           case 0x25 : { invalid = true; }
           case 0x26 : { invalid = true; }
           case 0x27 : { invalid = true; }
           case 0x2A : { invalid = true; }
           case 0x2C : { invalid = true; }
           case 0x3A : { invalid = true; }
           case 0x3B : { invalid = true; }
           case 0x3C : { invalid = true; }
           case 0x3D : { invalid = true; }
           case 0x3E : { invalid = true; }
           case 0x3F : { invalid = true; }
           case 0x5B : { invalid = true; }
           case 0x5D : { invalid = true; }
           case 0x60 : { invalid = true; }
           case 0x7B : { invalid = true; }
           case 0x7C : { invalid = true; }
           case 0x7D : { invalid = true; }
           case 0x20 : { invalid = true; }
          }
                  
          Format(s_encode, sizeof(s_encode), ((0x1F < Hex < 0x7F) && !invalid) ? "%s%c" : "%s%%%X", s_encode, Hex);
                  
          invalid = false;
         }
                 
         return s_encode;
}


Если можно что-то улучшить\упростить, пишите.

Добавлено (27.02.2014, 14:30:20)
---------------------------------------------
А теперь я отвечу на вопрос, как же получить юникод (мульти) байт 1040 из русской буквы А.
Код

stock toUnicodeByte(const String:Char[])
{
         if(Char[0] == '\0') return -1;
         new Byte = toByte(Char[0]);
                 
         if(Byte >= 128)
         {
          if(Byte >= 240)
          {
           // 4 byte sequence
           if(strlen(Char) < 4) return -1;
                   
           Byte = (Byte % 8) * 262144 ;
           Byte += (toByte(Char[1]) % 64) * 4096 ;
           Byte += (toByte(Char[2]) % 64) * 64 ;
           Byte += (toByte(Char[3]) % 64) ;
          }
          else if(Byte >= 224)
          {
           // 3 byte sequence
           if(strlen(Char) < 3) return -1;
                   
           Byte = (Byte % 16) * 4096 ;
           Byte += (toByte(Char[1]) % 64) * 64 ;
           Byte += (toByte(Char[2]) % 64) ;
          }
          else if(Byte >= 192)
          {
           // 2 byte sequence
           if(strlen(Char) < 2) return -1;
                   
           Byte = (Byte % 32) * 64 ;
           Byte += (toByte(Char[1]) % 64) ;
          }
          else
          {
           // invalid sequence
           Byte = -1;
          }
         }
         return Byte;
}


Ну и наконец, как же получить обычный байт ?

Код

stock toByte(const String:Char[])
{
       if(Char[0] == '\0') return -1;
       return (Char[0] & 0xFF);
}


П.С. Сам спросил, сам ответил =_=

Добавлено (12.03.2014, 16:32:52)
---------------------------------------------
небольшое упрощение функции httpURLencode

Код

stock String:httpURLencode(const String:URL[])
{
  new String:s_encode[2048];
   
  new bool:invalid = false;
   
  for(new i = 0; i < strlen(URL); i++)
  {
   new Hex = (URL[i] & 0xFF);
    
   switch (Hex)
   {
    case
     0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2A, 0x2C, 0x3A, 0x3B,
     0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5D, 0x60, 0x7B, 0x7C, 0x7D, 0x20:
    { invalid = true; }
   }
    
   Format(s_encode, sizeof(s_encode), ((0x1F < Hex < 0x7F) && !invalid) ? "%s%c" : "%s%%%X", s_encode, Hex);
    
   invalid = false;
  }
   
  return s_encode;
}


Сообщение отредактировал хвостег - Четверг, 27.02.2014, 15:27:30
 
  • Страница 1 из 1
  • 1
Поиск: