Показать сообщение отдельно
Старый 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 нажился спасибкой от: