Могу предложить такой вариант. В принципе, должен работать с массивами любых типов (в том числе и динамическими)
X++:
str con2Str_ext(container _in, str 10 sep = ',')
{
int i;
container c;
int clen = conlen(_in);
int k;
str s;
str res;
int len;
int pos;
str 4 enumType;
DictEnum dictEnum;
enumId type;
date dt;
boolean first;
;
res = "";
for (k=1;k<=clen;k++)
{
c = [conpeek(_in, k)];
s = BinData::dataToString(new ContainerClass(c).toBlob());
s = strrem(s, "\r");
if (substr(s, 1, 2) == "07")
{
if (substr(s, 3, 1) == "2")
{
len = str2int("0x" + substr(s, 7, 2) + substr(s, 5, 2));
res += (res ? sep : "") + "[";
first = true;
switch (substr(s, 4, 1))
{
case "0": // строка
pos = 0;
s = substr(s, 6*2+1, strlen(s));
while (strscan(s, "00", 1, strlen(s)))
{
pos = strscan(s, "00", 1, strlen(s));
if (pos mod 2 == 0) pos++;
c = ContainerClass::blob2Container(
BinData::stringToData("0700" + substr(s, 1, pos-1) + "00ff"));
res += (!first ? sep : "") + con2str(c) ;
first = false;
s = strdel(s, 1, pos+1);
}
break;
case "1": // целое значение
for (i=0;i<len;i++)
{
c = ContainerClass::blob2Container(
BinData::stringToData("0701" + substr(s, i*8 + 9, 8) + "ff"));
res += (!first ? sep : "") + con2str(c) ;
first = false;
}
break;
case "2": // значение с плавающей точкой
for (i=0;i<len;i++)
{
c = ContainerClass::blob2Container(
BinData::stringToData("0702" + substr(s, i*20 + 9, 20) + "ff"));
res += (!first ? sep : "") + con2str(c) ;
first = false;
}
break;
case "3": // дата
for (i=0;i<len;i++)
{
c = ContainerClass::blob2Container(
BinData::stringToData("0703" + substr(s, i*6 + 9, 6) + "ff"));
[dt] = c;
res += (!first ? sep : "") + date2str(dt, 123, 2, 2, 2, 2, 4) ;
first = false;
// res += (res ? sep : "") + con2str(c) ;
}
break;
case "4": // енум
enumType = substr(s, 9, 4);
type = str2int("0x" + substr(enumType, 3, 2) + substr(enumType, 1, 2));
dictEnum = new DictEnum(type);
for (i=0;i<len;i++)
{
/* c = ContainerClass::blob2Container(
BinData::stringToData("0704" + substr(s, i*2 + 13, 2) + enumType + "ff"));
res += (res ? sep : "") + con2str(c) ;*/
// если необходимо выводить значения енума в числовом виде,
// то надо убрать предыдущий комментарий и закомментировать эту строку
res += (!first ? sep : "") + /*dictEnum.name() + "::" + */dictEnum.value2Symbol(str2int("0x" + substr(s, i*2 + 13, 2)));
first = false;
}
break;
}
res += "]";
}
else
{
s = conpeek(c, 1);
res += (res ? sep : "") + s;
}
}
}
return res;
}
Будет отличие в выводе для енумов по сравнению со стандатным - в функции они будут выводиться в соответствии со своими именами
Для динамических массивов возможно появление в конце пустых значений. Для енумов это будет элемент с EnumValue==0 (если он есть)