Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 23:57   #1
zxzLeejacKzxz
 
Регистрация: 12.06.2012
Сообщений: 3
По умолчанию Разбор кода CSharp

К сожалению с сями не знаком!((
Что знаю по коду. То он из *.dat файла выдергивает нужные данные.
Вот прошу помочь с разбором кода. Чтобы я смог переписать его под Delphi
Можете хотя бы прокомментировать строчки?
Код:
public class StatsFile
{
    public const short RANK_VERSION = 11;
 
    public class StatsEntry
    {
        public StatsEntry()
        {
            bodyHits = new uint[9];
        }
 
        public String name;
        public String unique;
        public uint tks;
        public uint damage;
        public uint deaths;
        public int kills;
        public uint shots;
        public uint hits;
        public uint hs;
        public uint bDefusions;
        public uint bDefused;
        public uint bPlants;
        public uint bExplosions;
        public uint [] bodyHits;
    }
 
    public static ArrayList ReadEntriesToList(string file)
    {
        if (!File.Exists(file))
        {
            throw new FileNotFoundException();
        }
 
        System.IO.FileStream stream = File.Open(file, System.IO.FileMode.Open);
 
        if (stream == null)
        {
            throw new FileLoadException();
        }
 
        BinaryReader br = new BinaryReader(stream);
        ArrayList list;
 
        try
        {
            short vers = br.ReadInt16();
 
            if (vers != RANK_VERSION)
            {
                throw new Exception("Bad stats version");
            }
 
            ushort num = br.ReadUInt16();
            list = new ArrayList();
 
            while (num != 0)
            {
                StatsEntry entry = new StatsEntry();
 
                byte [] name = br.ReadBytes(num);
                num = br.ReadUInt16();
                byte [] unique = br.ReadBytes(num);
 
                entry.name = Encoding.ASCII.GetString(name, 0, name.Length-1);
                entry.unique = Encoding.ASCII.GetString(unique, 0, unique.Length-1);
 
                entry.tks = br.ReadUInt32();
                entry.damage = br.ReadUInt32();
                entry.deaths = br.ReadUInt32();
                entry.kills = br.ReadInt32();
                entry.shots = br.ReadUInt32();
                entry.hits = br.ReadUInt32();
                entry.hs = br.ReadUInt32();
                entry.bDefusions = br.ReadUInt32();
                entry.bDefused = br.ReadUInt32();
                entry.bPlants = br.ReadUInt32();
                entry.bExplosions = br.ReadUInt32();
 
                for (int i=0; i<entry.bodyHits.Length; i++)
                {
                    entry.bodyHits[i] = br.ReadUInt32();
                }
 
                num = br.ReadUInt16();
 
                list.Add(entry);
            }
        }
        catch 
        {
            throw new FileLoadException("Error reading file");
        }
        finally
        {
            if (br != null)
            {
                br.Close();
                br = null;
            }
            if (stream != null)
            {
                stream.Close();
                stream = null;
            }
        }
 
        return list;
    }
}
Если кому поможет, то прилагаю еще и копирайт от куда взят код. Там есть и описание, но только на инглише!

Последний раз редактировалось zxzLeejacKzxz; 13.06.2012 в 00:04.
zxzLeejacKzxz вне форума Ответить с цитированием
Старый 13.06.2012, 01:00   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да что тут комментировать
открываете файло и читаете из него побайтно поля

Код:
ushort num = br.ReadUInt16();
прочитали 2 байта

Код:
byte [] name = br.ReadBytes(num);
прочитали в массив num байт

Код:
 entry.name = Encoding.ASCII.GetString(name, 0, name.Length-1);
перевели это добро в строку

и т.д., всё крайне просто и однозначно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 13.06.2012, 06:22   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...тут чтение из бинарника происходит блоками со структурой четко определенного размера, т.е. все данные в блоке смещены на четко определенное значение. Вначале описываете структуру и уже далее читаете, как указали выше, ничего сложного.

Т.о. вот это:
Код:
entry.tks = br.ReadUInt32();
                entry.damage = br.ReadUInt32();
                entry.deaths = br.ReadUInt32();
                entry.kills = br.ReadInt32();
                entry.shots = br.ReadUInt32();
                entry.hits = br.ReadUInt32();
                entry.hs = br.ReadUInt32();
можно даже упростить. При чтении из FileStream, к примеру, entry смещено на известное значение и достаточно будет просто считывать в переменную со структурой entry, как все ее составляющие будут автоматом определены.

Приведу пример:
Код:
// ПАРСЕР ----------------------------
type

  //FILE STRUCT-
  NameHead=record
   name:array [0..255] of Char; // НАЗВАНИЕ регистрации  //name: string[255];
   BytePosRectList,             // начало item rectlist
   CountRectList,               // к-во   item rectlist
   BytePosTableList,            // начало tablelist
   CountTableList,              // к-во   item tablelist
   BytePosBigData,              // начало bigdata
   CountBigData: Longword;      // к-во   item bigdata
  end;

  RectList=record               // ITEM RectList
   BetaStart,                   // нач.угол сегмента 360/0..16384_0.0219°
   BetaEnd,                     // кон.угол сегмента 360/0..16384_0.0219°
   DStart,                      // нач.сегмента      0..1599_250м
   DEnd: Longword;              // кон.сегмента      0..1599_250м
  end;

  RectList_=record              // пересчитанные
   BetaStart,                   // °
   BetaEnd,                     // °
   DStart,                      // м
   DEnd: real;                  // м
  end;

  TableList=record              // ITEM TableList
   Head0,                       // kod[0..15] id[16..19] kpp[20..21] oborot[22]
   Head1,                       // beta[0..13] cntrot[16..23] rectlistitemindex[24..31]
   Point,                       // bytepos= point*4
   Count: Longword;             // countbyte= count*2
  end;
  TableList_=record             // пересчитанные
   kod,
   id,
   kpp,
   ob: integer;
   beta: double;
   cntrot,
   rlii: integer;
   point,
   count: longword;           //32bit
  end;
  TableBigData=record
   Head0,
   Head1: Longword;
  end;
  
  TListDAT=record //массив DAT
   rl: array of RectList_;
   tl: array of TableList_;
  end;

  PRL=^RectList;
  PTL=^TableList;
// END ПАРСЕР -----------------------------------------------------------------

var rl_  : array of RectList_;    //подменим tlist -> дин.массив ITEM RectList
    tl_  : array of TableList_;   //- архив
    cu_  : array of CUList_;      //- архив CU
                                  // МАССИВ АРХИВОВ ---------------------------

    cnt_elem_diskr,cnt_diskr: integer;
    head : NameHead;
    fDAT,fCU: TMemoryStream;



procedure tpgl.GetInfoParser_DAT(lib: string); // ПАРСЕР по HEAD/TABLE-
var i,j: integer;
    recl : RectList;
    tabl : TableList;
begin
 fDAT.Free;
 fDAT:= TMemoryStream.Create;
 fDAT.LoadFromFile(lib);

 //============================= NAME REG
 fDAT.Read(head, SIZEOF(head));
 if pos('Marabu',head.name)=0 then begin
  fDAT.Free;
 
  exit
 end;
 setlength(rl_,0); 
 setlength(tl_,0);
 progress_DAT:= '';
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 13.06.2012 в 06:24.
raxp вне форума Ответить с цитированием
Старый 13.06.2012, 06:22   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
не влезло
Код:
//============================= ADRESS TABLE
 //визуализируем -необ
 if Assigned(FDeskrChange) then FDeskrChange(Self,head.name); //это если компонентом
 progress_DAT:= '... ' + head.name;
 //============================= ITEM RectList (дин)
 for i:=0 to head.CountRectList-1  do begin
  fDAT.Position:= head.BytePosRectList + 4*4*i;
  fDAT.Read(recl, SIZEOF(recl));
  //архив пересчитанных-
  setlength(rl_,length(rl_)+1);
  rl_[length(rl_)-1].BetaStart:= recl.BetaStart*360/16384;
  rl_[length(rl_)-1].BetaEnd  := recl.BetaEnd*360/16384;
  rl_[length(rl_)-1].DStart   := recl.DStart*250/1599;
  rl_[length(rl_)-1].DEnd     := recl.DEnd*250/1599
 end;
 //============================= ITEM TableList (дин)
 head.BytePosTableList:= head.BytePosRectList + (head.CountRectList*4*4); //fix- в файле
 for i:=0 to head.CountTableList-1  do begin
  fDAT.Position:= head.BytePosTableList + 4*4*i;
  fDAT.Read(tabl, SIZEOF(tabl));

  //проверка на $AA55
  if get_data(0,15,tabl.Head0)=$AA55 THEN BEGIN
   //архив пересчитанных-
   setlength(tl_,length(tl_)+1);
   tl_[length(tl_)-1].kod   := get_data(0,15,tabl.Head0);
   tl_[length(tl_)-1].id    := get_data(16,19,tabl.Head0);
   tl_[length(tl_)-1].kpp   := get_data(20,21,tabl.Head0);
   tl_[length(tl_)-1].ob    := getbit(tabl.Head0,22);
   tl_[length(tl_)-1].beta  := get_data(0,13,tabl.Head1)*360/16384;
   tl_[length(tl_)-1].cntrot:= get_data(24,31,tabl.Head1);
   tl_[length(tl_)-1].rlii  := get_data(16,23,tabl.Head1);
   tl_[length(tl_)-1].point := tabl.Point;
   tl_[length(tl_)-1].count := tabl.Count
  END
 end;
 
end;
// END ПАРСЕР -------------------------------
cмысл ясен?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 13.06.2012, 07:25   #5
zxzLeejacKzxz
 
Регистрация: 12.06.2012
Сообщений: 3
По умолчанию

Спасибо ребят вам ОГРОМНОЕ! Очень помогли! ) Век вам здоровья!)) Уже весь инет перелопатил!) Никак сообразить не мог!) Спасибо!
zxzLeejacKzxz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор кода Arhit Помощь студентам 3 22.01.2012 16:34
Разбор кода Delphi cv0l04b Помощь студентам 3 07.01.2012 13:39
С++ Разбор кода хэширования Md5 Чёрный ветер Помощь студентам 1 20.12.2011 00:38
Разбор куска кода. Alexcomeback Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.04.2011 18:14
Разбор кода. С++ TIT0 Помощь студентам 0 27.12.2010 11:17