Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Игры разума
Перезагрузить страницу Как определить длину строки lineage2:systemmsg-x.dat
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,453
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию Как определить длину строки lineage2:systemmsg-x.dat - 14.02.2006, 07:57

в упрощенном виде задача такая: длина строки символов кодируется двумя байтами, находящимися перед строкой.

если второй байт == 1, частный вид формулы вычисления длины f() = первый байт - (256 - первый байт):

Код:
код длины           длина строки       формула расчета длины
D601 = 214 и 1      AC bytes = 172      214 – (256-214)
E701 = 231 и 1      CE bytes = 206      231 – (256-231)
D901 = 217 и 1      B2 bytes = 178      217 – (256-217)
если второй байт > 1, вот тогда вопрос - что за формула
Код:
код длины           длина строки       формула расчета длины
F403 = 244 и 3      0x1e8 bytes = 488   ???????????
FB06 = 251 и 6      0x376 bytes = 886   ???????????


Как прикреплять картинки к сообщениям: http://www.hardforum.ru/t116562
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 14.02.2006, 16:36

Данных для решения, конечно, маловато, но на первый взгляд похоже так:
<второй байт+1>*0x80 + <первый байт как знаковое>*2

то есть:
Код:
D6 01 -> 0080*2 + FFD6*2 = 0100 + FFAC = 00AC
E7 01 -> 0080*2 + FFE7*2 = 0100 + FFCE = 00CE
D9 01 -> 0080*2 + FFD9*2 = 0100 + FFB2 = 00B2

F4 03 -> 0080*4 + FFF4*2 = 0200 + FFE8 = 01E8
FB 06 -> 0080*7 + FFFB*2 = 0380 + FFF6 = 0376
Ответить с цитированием
  (#3 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,453
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 15.02.2006, 08:03

Код:
4F 02 = 0x8F       0080*3 + FF4F*2 = 0180 + FE9E = 001E
7B 02 = 0xBB       0080*3 + FF7B*2 = 0180 + FEF6 = 0076
7B 03 = 0xFB       0080*4 + FFFB*2 = 0200 + FFF6 = 01F6
59 05 = 0x159      0080*6 + FF59*2 = 0300 + FEB2 = 01B2
6A 03 = 0xEA       0080*4 + FF6A*2 = 0200 + FED4 = 00D4
55 02 = 0x95       0080*3 + FF55*2 = 0180 + FEAA = 002A


Как прикреплять картинки к сообщениям: http://www.hardforum.ru/t116562
Ответить с цитированием
  (#4 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 15.02.2006, 11:58

Старший бит первого байта во всех случаях = 0. Видимо здесь другой вариант:
<второй байт-1>*0x40 + <первый байт>
Код:
4F 02 = 0x8F       0040*1 + 004F = 0040 + 004F = 008F
7B 02 = 0xBB       0040*1 + 007B = 0040 + 007B = 00BB
7B 03 = 0xFB       0040*2 + 00FB = 0080 + 007B = 00FB
59 05 = 0x159      0040*4 + 0059 = 0100 + 0059 = 0159
6A 03 = 0xEA       0040*2 + 006A = 0080 + 006A = 00EA
55 02 = 0x95       0040*1 + 0055 = 0040 + 0055 = 0095
Ответить с цитированием
  (#5 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,453
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 16.02.2006, 10:47

да, большое спасибо! все вроде сходится
код получился такой:
Код:
  byte[] startmassive = new byte[0x1c];
  byte[] buffer = new byte[2048];
  int globalID;

  private void bOpenFile_Click(object sender, System.EventArgs e)
  {
      if(openFileDialog1.ShowDialog() == DialogResult.OK)
      {
    tbFilename.Text = openFileDialog1.FileName;
    FileStream fs = new FileStream(tbFilename.Text, FileMode.Open, FileAccess.Read, FileShare.Read);
    long len = fs.Length;
    int id = 0, strlen, count;
    byte a, b, c, d, f;
    string strMsg = "", strSound, strGroup, strColor, strAttr;
    string []groups = {"none", "battle", "server", "damage", "popup", "error", "petition", "useitems"};
    
    // Create two different encodings.
    Encoding ascii = Encoding.ASCII;
    Encoding unicode = Encoding.Unicode;
    
    byte[] strbytes = new byte[300];
    char[] asciiChars = new char[300];

    //загрузка заголовка
    fs.Seek(0, SeekOrigin.Begin);
    fs.Read(startmassive, 0, 0x1c);

    //загрузка количества записей
    fs.Read(buffer, 0, 4);
    count = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24);
    while(fs.Position < fs.Length && id < count)
    {
        //ID записи
        fs.Read(buffer, 0, 4);
        id = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24);
        globalID = id;
        
        //число 0x00000001
        fs.Read(buffer, 0, 4);
        if(id == 0x6661530C) break;
        
        //текст сообщения
        strMsg = ReadText(fs, 1);
        
        //группа сообщения
        fs.Read(buffer, 0, 4);
        strGroup = groups[buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24)];
        
        //цвет сообщения
        fs.Read(buffer, 0, 4);
        int intColor = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24);
        strColor = intColor.ToString("X");

        //звук
        strSound = ReadText(fs, 1);

        //аттрибут
        strAttr = ReadText(fs, 1);

        DataRow newRow = dtSystemMessages.NewRow();
        // Set values in the columns:
        newRow["columnID"] = id;
        newRow["columnMsg"] = strMsg;
        newRow["columnGroup"] = strGroup;
        newRow["columnColor"] = strColor;
        newRow["columnSound"] = strSound;
        newRow["columnAttr"] = strAttr;

        // Add the row to the rows collection.
        dtSystemMessages.Rows.Add(newRow);

    }
    fs.Close();
      }
  }
  private char AnsiToUnc(byte ansiChar)
  {
      byte[] buf = new byte[2];
      
      buf[0] = ansiChar;
      buf[1] = 0;
      char[] cbuf = System.Text.Encoding.Unicode.GetChars(buf);
      return cbuf[0];
  }
  private string ReadText(FileStream file, int bytes)
  {
      StringBuilder result = new StringBuilder();//bb=76, b0 = 60, b1 = 62, af = 5e, 83 = 00, (byte1 - 0x80) * 2
      Array.Clear(buffer, 0, buffer.Length);
      file.Read(buffer, 0, bytes);
      int len = buffer[0] | (buffer[1] << 8) | (buffer[2] << 16) | (buffer[3] << 24);
      if(bytes == 1)
      {
    if(len >= 64)// && len <128)
    {
        result.Length = 0;
        int len2 = 1;
        len2 = file.ReadByte();
        if(len2 > 12)
        {
      file.Seek (file.Position - 1, SeekOrigin.Begin);
      //len2 = 1;
      len = (len - 0x80) * 2;
        }
        else
        {
      //D6 01 -> 0080*2 + FFD6*2 = 0100 + FFAC = 00AC 
      if((len & 0x80) == 0x00)
      {
          len = 0x0040 * (len2 - 1) + len;
      }
      else
      {
          len = (len2 + 1) * 0x80 + 2 * (len - 256);
      }
        }
    }

      }
      if(len == 0) return "";

      Array.Clear(buffer, 0, buffer.Length);
      file.Read(buffer, 0, len);
      for(int i=0; i<=len; i++)
      {
    if(buffer[i] != 0)
        result.Append(AnsiToUnc(buffer[i]));
      }
      return result.ToString();
  }


Как прикреплять картинки к сообщениям: http://www.hardforum.ru/t116562
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести фамилию, имя и отчество как одно данное строкового типа. Определить длину с Andylarcyn Pascal 1 18.05.2012 15:20
для заданного текста определить длину содержащейся в нём максимальной последовательно Anf Вопросы начинающих программистов 1 21.11.2011 02:00
определить сколько слов имеют максимальную длину nona C++ Builder 4 29.05.2011 19:30
Найти максимальную длину строки Цвяточек Алгоритмы 1 06.10.2010 03:53
В игре lineage2 сильно упал FPS. Fars Техническая поддержка 4 27.03.2010 11:44
Как определить Size строки начерченную с помощью DrawString SidorovaNata .NET 2 28.11.2008 18:22
Как определить длину слова Anatom Delphi 7 21.11.2008 23:45
Как в StringGrid ограничить длину строки вводимую в ячейку Ryzhyck C++ Builder 2 02.11.2004 21:32
Как в EXCELL определить выделенные ячейки или строки Anonymous C++ Builder 1 23.10.2003 10:38
Как узнать длину строки Trian C++ Builder 4 19.05.2003 10:53
Как узнать длину строки в поле Edit north_crow C++ Builder 2 26.02.2003 12:57
Как определить длину документа на CRichEditView Anonymous Visual C++ 0 13.10.2002 12:31



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов