Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Разработка
Войти через OpenID

Разработка Раздел для совместной разработки/доработки программы

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 11.02.2012, 14:34   #21
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
насчёт move - аналог arraycopy в яве вроде
Дакументацию я читал, там просто очень много вариантов...
arraycopy ща гляну. Проблема в том (покрайней мере для меня) что он все время перемещает разные типы данных, например:
Move(Len,send_buff[0],2);
Move(buff[0],send_buff[2],Len-2);
Move(data[0],xld,4);
Move(DBuff,data[i*8],8);
Move(data[i*8],DBuff,8);
...

Я просто думаю что цифра procedure Move(const Source; var Dest; Count: Integer); count это тип данных.

Можешь привети пример перевода используя arraycopy, ну хотябы для тех которые я написал?
Tin-moon вне форума   Ответить с цитированием
Старый 11.02.2012, 15:24   #22
Местный
 
Регистрация: 23.02.2009
Сообщений: 319
Сказал Спасибо: 72
Имеет 60 спасибок в 45 сообщенях
Kilatif пока неопределено
По умолчанию

Цитата:
Len:=recv(RS_Sock,main_buff,MAX_PKT_SIZE,0);
Len = кол-ву байт пакета, которое придет на сокет, поэтому использовать это значение не всегда правильно.
Правильно читать пакет нужно следующим образом:
1) Считываем первые 2 байта пакета с сокета (сервер в этих двух байтах присылает полный размер пакета)
2) Далее считываем данные с сокета до тех пор, пока мы не считаем столько, сколько было указано в тех самых двух байтах минус 2 байта
Например пакет:
0x07 0x00 0xAA 0xBB 0xCC 0xDD 0xFF

Полный размер пакета = 7 байт
Данные пакета = 5 байт
Сначала считываем первых 2 байта и получаем размер 7 байт
А потом считываем Данные пакета, т.е. 7 - 2 = 5 байт

Цитата:
насчёт move - аналог arraycopy в яве вроде
Ну не совсем мне кажется.. Вся фигня в том, что move - Работает непосредственно с памятью, поэтому если переводить из масива байт в массив интов, то он переведет не поэлементно, а по памяти (0xAA, 0xBB, 0xCC, 0xDD переведет в 0xAABBCCDD, а не в 0x000000AA, ... ...), а вот arraycopy переведет из массива байт в массив интов именно поэлементно

Цитата:
Move(Len,send_buff[0],2);
Move(buff[0],send_buff[2],Len-2);
Move(data[0],xld,4);
Move(DBuff,data[i*8],8);
Move(data[i*8],DBuff,8);
На яве примеры привести не смогу, приведу на C# (ИМХО самый близкий к яве)

Пусть есть такие данные:
byte[] buff = new byte[20];
byte[] data = new byte[20];
int Len;
int xld;
byte[] DBuff = new byte[20];

Тогда:
1) Move(Len,send_buff[0],2)
Array.Copy(BitConvert.GetBytes((Int16)Len), 0, send_buff, 0, 2);

byte[] BitConvert.GetBytes(Int16 value) - переводит 16-битное число value в массив байт
BitConvert.GetBytes((Int16)Len) - т.к. Len = 4 байт, мы приводим тип к Int16 (к двум байтам), потому что скопировать нам надо 2 байта

2) Move(buff[0],send_buff[2], Len-2)
Array.Copy(buff, 0, send_buff, 2, Len-2)

3) Move(data[0],xld,4);
xld = BitConvert.ToInt32(data, 0); // переводит из массива байт data в 32-битное число начиная со смещения 0

4) Move(DBuff,data[i*8],8);
Array.Copy(DBuff, 0, data, i*8, 8);

5) Move(data[i*8],DBuff,8);
Array.Copy(data, i*8, DBuff, 0, 8);

Цитата:
Я просто думаю что цифра procedure Move(const Source; var Dest; Count: Integer); count это тип данных.
Не совсем так
Count - количество байт, которое будет копироваться
Иногда оно совпадает с типом данных (Пример 3)
Иногда это просто скопировать из одного массива в другой несколько байт (Пример 2, 4, 5)
Иногда оно будет меньше чем тип, из которого мы копируем (Пример 1)

Т.к. в яве нет операция для манипуляций с памятью на прямую (коих в c# я тоже не нашел), то нужно использовать манипуляции с массивами, но для этого четко нужно представлять как они устроены в памяти и как работает процедура Move и иже с ними

Последний раз редактировалось Kilatif, 11.02.2012 в 15:27.
Kilatif вне форума   Ответить с цитированием
За это сообщение Kilatif нажился спасибкой от:
Старый 11.02.2012, 15:46   #23
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Цитата:
Сообщение от Kilatif Посмотреть сообщение

2) Move(buff[0],send_buff[2], Len-2)
Array.Copy(buff, 0, send_buff, 2, Len-2)

Иногда это просто скопировать из одного массива в другой несколько байт (Пример 2, 4, 5)
Получается тут копируется из buff начиная с 0 до Len-2 в send_buff начиная со 2??

Явовский делает вот такое:
char[] copyFrom = { '0', '0', '0', '0', '0', '0', '0',
'0', '0', '0', '0', '0', '0' };
char[] copyTo = {'1','1','1','1','1','1','1'};

// копируем со 2 элемента - 6 штук в copyTo с 0
System.arraycopy(copyFrom, 2, copyTo, 0, 6);
System.out.println(new String(copyTo));

итог = 0000001

Чет я начал находить + в C# ) тут тебе и ансигн и прочее)
Tin-moon вне форума   Ответить с цитированием
Старый 11.02.2012, 16:07   #24
Местный
 
Регистрация: 23.02.2009
Сообщений: 319
Сказал Спасибо: 72
Имеет 60 спасибок в 45 сообщенях
Kilatif пока неопределено
По умолчанию

Цитата:
Получается тут копируется из buff начиная с 0 до Len-2 в send_buff начиная со 2??
Нет, не с 0 до Len-2, а c нуля Len-2 штук
Вот как в твоем примере, он начал со второго и скопировал 6 штук
Kilatif вне форума   Ответить с цитированием
Старый 11.02.2012, 16:16   #25
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Цитата:
Сообщение от Kilatif Посмотреть сообщение
Нет, не с 0 до Len-2, а c нуля Len-2 штук
Вот как в твоем примере, он начал со второго и скопировал 6 штук
т.е. для 2 случая делается одинаково (java and C#)?
Слушай я тебя наверно уже достал, но не мог бы ты взять мои данные и прогнать на тех примерах которые ты написал, ну инт задай какой-нибудь. Если кончено не подтер уже , а то еще С# устанавливать уже места нема)

Последний раз редактировалось Tin-moon, 11.02.2012 в 16:19.
Tin-moon вне форума   Ответить с цитированием
Старый 11.02.2012, 17:48   #26
Местный
 
Регистрация: 23.02.2009
Сообщений: 319
Сказал Спасибо: 72
Имеет 60 спасибок в 45 сообщенях
Kilatif пока неопределено
По умолчанию

Цитата:
Сообщение от Tin-moon Посмотреть сообщение
т.е. для 2 случая делается одинаково (java and C#)?
Судя по описанию arraycopy() для ява, да)

Цитата:
Слушай я тебя наверно уже достал, но не мог бы ты взять мои данные и прогнать на тех примерах которые ты написал, ну инт задай какой-нибудь. Если кончено не подтер уже , а то еще С# устанавливать уже места нема)
Какие данные?
Kilatif вне форума   Ответить с цитированием
Старый 11.02.2012, 18:00   #27
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Цитата:
Сообщение от Kilatif Посмотреть сообщение
Какие данные?
char[] copyFrom = { '0', '0', '0', '0', '0', '0', '0',
'0', '0', '0', '0', '0', '0' };
char[] copyTo = {'1','1','1','1','1','1','1'};

int len = 186;
И прогнать по тем примерам что ты написал, распечать (формат я думаю важен).
А я сравню с тем что ява выведет.

Возник еще мальнький вопросик, в яве нет unsigned.. а в делфи некоторые данные в unsigned, я вот думаю мне хватит впилить в sign формат? Смотрел в сервере там long почти не используют... предположу, что все в int.


to Kilatif :Видел тему где ты бота начинал писать, поидее были примерно такие же проблемы. Дописал до чего толькового или кинул?

Последний раз редактировалось Tin-moon, 11.02.2012 в 18:06.
Tin-moon вне форума   Ответить с цитированием
Старый 11.02.2012, 22:38   #28
Местный
 
Регистрация: 23.02.2009
Сообщений: 319
Сказал Спасибо: 72
Имеет 60 спасибок в 45 сообщенях
Kilatif пока неопределено
По умолчанию

Цитата:
Сообщение от Tin-moon Посмотреть сообщение
char[] copyFrom = { '0', '0', '0', '0', '0', '0', '0',
'0', '0', '0', '0', '0', '0' };
char[] copyTo = {'1','1','1','1','1','1','1'};

int len = 186;
И прогнать по тем примерам что ты написал, распечать (формат я думаю важен).
А я сравню с тем что ява выведет.
1 Пример
Код:
byte[] copyFrom = new byte[13] { 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0};
byte[] copyTo = new byte[7] {1, 1, 1, 1, 1, 1, 1};

int len = 186; // 0x000000BA

Array.Copy(BitConverter.GetBytes((Int16)len), 0, copyTo, 0, 2);
//Результат:
//copyTo = {0xBA, 0x00, 1, 1, 1, 1, 1}
2 Пример
Код:
byte[] copyFrom = new byte[13] { 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0};
byte[] copyTo = new byte[7] {1, 1, 1, 1, 1, 1, 1};

int len = 3;

Array.Copy(copyFrom, 0, copyTo, 2, len)
//Результат:
//copyTo = {1, 1, 0, 0, 0, 1, 1}
3 Пример
Код:
byte[] copyFrom = new byte[13] { 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0};
byte[] copyTo = new byte[7] {1, 1, 1, 1, 1, 1, 1};

int xld;

xld = BitConvert.ToInt32(copyTo, 0); //Move(copyTo[0],xld,4);
//Результат:
//xld = 0x01010101
4 Пример аналогичен второму
5 Пример так же аналогичен второму

Цитата:
Возник еще мальнький вопросик, в яве нет unsigned.. а в делфи некоторые данные в unsigned, я вот думаю мне хватит впилить в sign формат? Смотрел в сервере там long почти не используют... предположу, что все в int.
signed, unsigned приставка никак не влияет на размер переменной, эта приставка влияет только на то, будет ли у переменной отрицательные значения . Например:
unsigned int x // размер 4 байт, но вмещает в себя от 0 до 4294967295
signed int x // размер 4 байт, но вмещает в себя от -2147483647 до -2147483647


Цитата:
to Kilatif :Видел тему где ты бота начинал писать, поидее были примерно такие же проблемы. Дописал до чего толькового или кинул?
Да, доходил до Enter World и забрасывал Дальше все легко получается. Вот сейчас пишу на C#, тоже дошел до Enter World и теперь парсирую нужные мне пакеты

Примеры напишу позже

Последний раз редактировалось Kilatif, 12.02.2012 в 00:55.
Kilatif вне форума   Ответить с цитированием
За это сообщение Kilatif нажился спасибкой от:
Старый 12.02.2012, 19:54   #29
Местный
 
Регистрация: 23.02.2009
Сообщений: 319
Сказал Спасибо: 72
Имеет 60 спасибок в 45 сообщенях
Kilatif пока неопределено
По умолчанию

Вот мой класс BlowFish На C#
Вложения
Тип файла: rar BlowFish.rar (7.8 Кб, 60 просмотров)
Kilatif вне форума   Ответить с цитированием
Старый 13.02.2012, 00:53   #30
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Цитата:
Сообщение от Kilatif Посмотреть сообщение
Вот мой класс BlowFish На C#
Спасибо, все-таки с С# переписывать удобнее

Падает на этой функции:
Код:
        private long S(long x, byte i)
        {
            byte[] bts = new byte[4];

            bts = BitConverter.GetBytes(x);
            return SBoxes[i, bts[3-i]];
        }
Проблема в чем: С# выдает {3, 169, 95, 79, 0, 0, 0, 0}, а ява {3, -87, 95, 79, 0,0,0,0}. Понятное дело что нет в массиве такого числа. Кто знает как эту проблему решить?


Вроде решил:
Код:
        int j = 0;
        if(bts[3-i] < 0){
            j = HelpFunctions.UB2I(bts[3-i]);
        }
        else{
            j = bts[3-i];
        }
        return SBoxes[i][j];
подменяю отрицательные.
Проблема теперь в другом:
Массивы Parray и SBoxes после Init содержат только 0. Хотя в отладке вроде заполняются.

Последний раз редактировалось Tin-moon, 13.02.2012 в 01:19.
Tin-moon вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Разработка


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

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

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


Часовой пояс GMT +4, время: 22:58.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!