Цитата:
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 и иже с ними