Дакументацию я читал, там просто очень много вариантов...
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, ну хотябы для тех которые я написал?
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 переведет из массива байт в массив интов именно поэлементно
byte[] BitConvert.GetBytes(Int16 value) - переводит 16-битное число value в массив байт
BitConvert.GetBytes((Int16)Len) - т.к. Len = 4 байт, мы приводим тип к Int16 (к двум байтам), потому что скопировать нам надо 2 байта
Я просто думаю что цифра procedure Move(const Source; var Dest; Count: Integer); count это тип данных.
Не совсем так
Count - количество байт, которое будет копироваться
Иногда оно совпадает с типом данных (Пример 3)
Иногда это просто скопировать из одного массива в другой несколько байт (Пример 2, 4, 5)
Иногда оно будет меньше чем тип, из которого мы копируем (Пример 1)
Т.к. в яве нет операция для манипуляций с памятью на прямую (коих в c# я тоже не нашел), то нужно использовать манипуляции с массивами, но для этого четко нужно представлять как они устроены в памяти и как работает процедура Move и иже с ними
Последний раз редактировалось Kilatif, 11.02.2012 в 15:27.
Нет, не с 0 до Len-2, а c нуля Len-2 штук
Вот как в твоем примере, он начал со второго и скопировал 6 штук
т.е. для 2 случая делается одинаково (java and C#)?
Слушай я тебя наверно уже достал, но не мог бы ты взять мои данные и прогнать на тех примерах которые ты написал, ну инт задай какой-нибудь. Если кончено не подтер уже , а то еще С# устанавливать уже места нема)
Последний раз редактировалось Tin-moon, 11.02.2012 в 16:19.
т.е. для 2 случая делается одинаково (java and C#)?
Судя по описанию arraycopy() для ява, да)
Цитата:
Слушай я тебя наверно уже достал, но не мог бы ты взять мои данные и прогнать на тех примерах которые ты написал, ну инт задай какой-нибудь. Если кончено не подтер уже , а то еще С# устанавливать уже места нема)
int len = 186;
И прогнать по тем примерам что ты написал, распечать (формат я думаю важен).
А я сравню с тем что ява выведет.
Возник еще мальнький вопросик, в яве нет unsigned.. а в делфи некоторые данные в unsigned, я вот думаю мне хватит впилить в sign формат? Смотрел в сервере там long почти не используют... предположу, что все в int.
to Kilatif :Видел тему где ты бота начинал писать, поидее были примерно такие же проблемы. Дописал до чего толькового или кинул?
Последний раз редактировалось Tin-moon, 11.02.2012 в 18:06.
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.
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}. Понятное дело что нет в массиве такого числа. Кто знает как эту проблему решить?