05.04.2007, 09:37 | #1 |
Участник
|
Бинарные данные в Axapta
Есть функция в dll (ZLIB), которая возвращает бинарные данные. Функция корректно работает, но проблема в том, как достать полученные данные из класса Binary.
Вариант скопировать в контейнер вот так: X++: for (i=0;i<sizeBuf.dWord(0);i++)
ret+=outBuf.byte(i); Подстажите, пожалуйста, способ ускорить данный процесс. Темы: Binary -> Container и container -> image и Axapta и BLOB поля смотрел, но так и не нашел ответа на свой вопрос. |
|
05.04.2007, 10:19 | #2 |
Модератор
|
копировать в массив с помощью \System Documentation\Classes\Binary\binary() ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
05.04.2007, 10:27 | #3 |
Участник
|
|
|
05.04.2007, 15:43 | #4 |
Модератор
|
Цитата:
__________________
-ТСЯ или -ТЬСЯ ? |
|
07.04.2007, 11:51 | #5 |
Участник
|
Переброска в массив (экземпляр класса Array) мало чем поможет.
Дело в том, что скорость доступа к элементам массива равна скорости доступа к элементам Binary. Т.е. для массива, в итоге, время будет больше - за счет прибавки времени конвертации (у меня получилось дополнительно порядка 400 мс на мегабайт). Но задачу в том виде, что вы привели, можно ускорить процентов на 40 просто за счет обращение не к byte(), а к dWord() Примерно так X++: int sizeDiv4; int sizeMod4; int val; int size; ; ... sizeDiv4 = sizeBuf.dWord(0) div 4; sizeMod4 = sizeBuf.dWord(0) mod 4; size = sizeDiv4 + (sizeMod4 ? 1 : 0); for (i=0;i<size;i++) { if (sizeDiv4 > i) { val = outBuf.dword(i * 4); k += val & 0xff; k += val >> 8 & 0xff; k += val >> 16 & 0xff; k += val >> 24 & 0xff; } else { k += outBuf.byte(i * 4); if (sizeMod4 > 1) k += outBuf.byte(i * 4 + 1); if (sizeMod4 > 2) k += outBuf.byte(i * 4 + 2); } } Я бы рекомендовал выносить сложные расчетный задачи во внешний код (dll или COM), а в Axapta'у передавать уже результат.
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 09.04.2007 в 10:04. Причина: очепятка |
|