Изменения функции RQ_GetINTLIS

Больше
13 года 4 мес. назад #1 от rrrFer_
rrrFer_ создал тему: Изменения функции RQ_GetINTLIS
Вобщем надо было использовать эту замечательную функцию...
Не знаю как она написана на delhpi, но на С++ очень ужасно.
Начиная от того, что она возвращает не INTLIST( т.к. размер списка возвращает отдельно, а не в первом элементе), заканчивая тем, что выбирая размер списка руководствуется не только тем что находится в первом элементе, но и размером всего пакета. Если в пакете после списка что-то было - то оно будет помещено в список.
В последнее верится с трудом, но посмотрите:
i = (iLen-*iPos)/4;
    
	if (i>=iLLen) iLLen = i;

Вобщем исправил, и вот новый вариант:
DWORD RQ_GetINTLIST(BYTE * bArr, DWORD * iPos, DWORD iLen, int ** pList) {
	INT		iLLen;

	if ( ( *iPos + 4 ) > iLen ) 
		return 1;

	memcpy( &iLLen, &bArr[ *iPos ], 4 );
	*iPos += 4;
	
	*pList = new int[ iLLen + 1];
	memcpy( &pList[ 0 ][ 1 ], &bArr[ *iPos ], iLLen * 4 );

	pList[ 0 ][ 0 ] = iLLen;

	return 0;
}
Более подробное описание тут: pro-blog.16mb.com/archives/280

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
13 года 4 мес. назад #2 от Rapid D
Rapid D ответил в теме RE: Изменения функции RQ_GetINTLIS
Трудно читать, не понимая, что такое iLen и iPos.и тем более, что такое iLLen :)

Возвращает она:
char(PM_DATA)+_intlist(cl.toIntArray)
И первым идёт именно длина массива:
function _intlist(a:array of integer):string;
begin result:=_int(length(a))+_int(a) end;

Что и как возвращается плагинам - вы можете смотреть в открытых исходниках.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
13 года 4 мес. назад #3 от rrrFer_
rrrFer_ ответил в теме RE: Изменения функции RQ_GetINTLIS
Rapid D
Вы видимо о другой функции говорите? - я о той, которую вызывает плагин чтобы выделить INTLIST из байтового пакета, который пришел от клиента.
Изначально в miniSDK 4 версии для С++ она была описана так:
DWORD RQ_GetINTLIST(BYTE * bArr, DWORD * iPos, DWORD iLen, DWORD * iListLen, int ** pList) {
    DWORD iLLen,i;
    if ((*iPos+4)>iLen) return 1;
    memcpy(&iLLen,bArr+*iPos,4);
    *iPos+=4;
    i = (iLen-*iPos)/4;
 
    if (i>=iLLen) iLLen = i;
    *pList = (int*)(bArr+*iPos);
    *iPos += iLLen*4;
    *iListLen = iLLen;
    return 0;
}

А _intlist, которую вы описали принимает массив целых чисел...это из исходников клиента? (я их не смотрел, т.к. Delphi мной удачно забыто )

Трудно читать, не понимая, что такое iLen и iPos.

iLen - длина байтового пакета
iPos - позиция, начиная с которой надо выделить INTLIST

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
13 года 4 мес. назад #4 от rrrFer_
rrrFer_ ответил в теме RE: Изменения функции RQ_GetINTLIS
еще раз исправил, решил, что удобнее, все таки возвращать размер массива отдельно:
DWORD RQ_GetINTLIST( BYTE * bArr, DWORD * iPos, DWORD iLen, int &iLLen, int ** pList ) {
	
	if ( ( *iPos + INT_SIZE ) > iLen ) 
		return 1;

	memcpy( &iLLen, &bArr[ *iPos ], 4 );
	*iPos += INT_SIZE;
	
	*pList = new int[ iLLen ];
	memcpy( &pList[ 0 ][ 0 ], &bArr[ *iPos ], iLLen * INT_SIZE );

	*iPos += iLLen * INT_SIZE;

	return 0;
}

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: bassvazoozaDelphukdekRapid D
Время создания страницы: 0.243 секунд
Работает на Kunena форум