一种电信话单数据编解码方法

文档序号:6385617阅读:324来源:国知局
专利名称:一种电信话单数据编解码方法
技术领域
本发明涉及一种数据编解码方法,尤其涉及一种电信话单数据编解码方法。
背景技术
目前电信业务系统中详单存储格式都是定长定格式,即记录分条存放到文件,字段按照固有长度按顺序存放,如图1所示。这样存放,系统处理相对简单,效率因转换步骤少而相对较高。同时对系统维护人员和客户而言,这种话单也比较容易直接读取。但这种格式话单冗余度很高:为了保证存放足够的数据,每个字段长度以可能出现的字符的最大值设定,不够最大值长度的用空白填充。过大的数据冗余(并不代表相当的信息量)对存储、备份、管理、容灾都造成很大困难。另外,由于冗余数据也需要磁盘进行传输,造成系统IO浪费。定长话单格式的存储还造成复合话单存储困难。定长话单格式是一种“流”,话单字段顺序存储,字段和字段间只有先后关系而没有归属关系。但随着电信业务的快速发展,字段间关系逐渐有包含和从属关系产生,目前处理方式是将一对多的从属或包含关系,拆分成一对一的无从属关系后,再采用定长方式进行存储。这样存储造成了更多的数据冗余。如图1所示,电信话单记录目前都以定长方式存储,字段与字段间存在固定顺序,每个字段长度均固定,并且以此字段中数据的最大长度做为字段的默认长度。其中所有字段均为可见字符,日期型、整型或浮点型字段也都转换为可见字符进行展现。如此编码显然每条记录的长度均相同,每个字段起始位置也相同,方便直接对文件记录进行操作,比如计算记录数或截取某个字段等等。但因为字段长度采用的是字段内数据的最大长度,因此记录中存储的并非全部为有效数据,浪费字节数较多;另外,因为字段与字段间的顺序是固定的,调整某个字段的位置或变更长度将是一件十分困难的事情,这需要改动读取数据的相关程序以及对历史数据进行区别访问或全量格式转换。

发明内容
本发明所要解决的技术问题是,针对现有技术的不足,提供一种可有效降低目前计费数据的冗余度,提高数据存储资源的使用率的电信话单数据编码方法。本发明解决上述技术问题的技术方案如下:一种电信话单数据编码方法,具体包括以下步骤:步骤1:安装软件开发包;步骤2:配置软件开发包中的相关变量生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型;步骤3:按照所述配置文件中保存的不同的电信话单数据的类型,调用内存中预先保存的树型话单结构模型,所述树型话单结构模型与所述电信话单数据的各类型一一对应;步骤4:接收定长型的电信话单数据,判断其所属电信话单数据的类型,并存入与所述电信话单数据的类型相应的树形话单结构模型,生成二维的树型话单结构数据;步骤5:将生成的树型话单结构数据进行序列化操作,编码转换成一维的码流数据;步骤6:完成编码,清理并释放内存。本发明的有益效果是:本发明所描述的数据编码方法,可有效降低目前计费数据的冗余度,提高数据存储资源的使用率;本编码方法可以规划话单数据不同字段之间从属关系,使话单具备更好的扩展能力;本编码方法编解码效率很高,可替代已有的数据存储方法。在上述技术方案的基础上,本发明还可以做如下改进。进一步,所述步骤2具体包括以下步骤:步骤2.1:配置软件开发包中的相关环境变量;步骤2.2:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型。进一步,所述步骤2.1配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本。进一步,所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单按名称对应不同的树型话单结构模型,所述树型话单结构模型保存在内存中。进一步,所述步骤2.2中的编码采用直接编码方案,所述编码中标签为8位无符号整型;所述编码中对数值长度的编码为变长无符号整形数;所述编码中数值内容为变长的二进制流。本发明所要解决的技术问题是,针对现有技术的不足,提供一种可有效降低目前计费数据的冗余度,提高数据存储资源的使用率的电信话单数据解码方法。本发明解决上述技术问题的技术方案如下:一种电信话单数据解码方法,具体包括以下步骤:步骤1:安装软件开发包;步骤2:配置软件开发包中的相关变量生成配置文件,并将配置文件保存入内存,所述配置文件中包括至少三种电信话单数据的类型;步骤3:读取一条一维的码流数据;步骤4:将一维的码流数据存入内存中,并将码流数据解码转换为二维的树型话单结构数据,并将所述二维的树型话单结构数据的电信话单数据的类型与内存中预先保存的树型话单结构模型类比,匹配出对应的树型话单结构模型;步骤5:识别所述二维的树型话单结构数据对应的电信话单数据的类型,并按照所述电信话单数据的类型和与其相对应的树型话单结构模型将所述树型话单数据处理为定长型的电信话单数据;步骤6:读取所述定长型的电信话单数据;步骤7:完成解码,清理并释放内存。本发明的有益效果是:本发明所述的解码方法解码效率高,由于简化了数据嵌套关系以及直白的二进制数据存取,在基于新变长话单结构定义的编码/解码API执行效率,在CPU主频1.65GHz的主机上单线程处理效率>10000条/秒,满足电信话单数据处理的要求。在上述技术方案的基础上,本发明还可以做如下改进。进一步,所述步骤2具体包括以下步骤:步骤2.1:配置软件开发包中的相关环境变量;步骤2.2:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型。进一步,所述步骤2.1配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本。进一步,所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单对应不同的树型话单结构模型,所述树型话单结构模型保存在内存中。如图2所示,为树型话单格式示意图,话单数据存储结构的改造,主要将这种定长定格式的数据,改造成树型话单数据,树型存储的数据中的数值字段均为树的叶子,树的非叶子结点则用于字段的分组和管理。树型结构的字段多少和顺序没有强制要求,并且因为树型话单可以递归定义,所以能够更方便存放话单数据。如图3所示,为本发明采用的数据编码方法示意图,数据编码采用直白编码方案,只进行网络字节序转换而不进行任何数据类型变换,以降低在数据在读取和处理过程中的额外开销。编码中标签为8位无符号整型,可以有256种不同编码方式。由于标签在新编码规则的配置文档中定义成上下文相关,当话单结构分为η层时,理论可用标签个数将有256的η次方个。针对电信话单,每个话单子层区分256个不同标签已能满足要求。编码中对数值长度的编码为变长无符号整型数。如果长度第一个bit位是0,则表示长度占用15bit,如果第一个bit位是I,则表示长度占用31bit。普通电信话单,15bit的长度(32K)已经满足要求,对特殊应用场景下的复合话单,31bit (2G)的长度也可满足要求。编码中数值内容为变长的二进制流。二进制流对应的数据类型,由配置文档中定义的数据类型进行转换。通过使用新的编码方式,使话单具备更灵活的扩展能力,并且在话单格式升级后,自然兼容原话单格式,避免对大量数据的转换工作。对整型或字节流类型的数据,统一按照二进制方式进行存储,极大降低了对存储的消耗。与定长话单的存储格式冗余度分析对比结果如下:以安徽移动业务支撑系统的详单格式为例,定长编码话单中,普通语音详单共计39个数据字段,每条话单定义长度固定465字节。随机取一批语音话单文件,统计其中空格字符和换行符的个数。然后计算所有文件大小,用空格符和换行符占总文件大小的比例来计算文件中记录的冗余度。经统计,语音话单冗余度38.5%,短信话单冗余度51.4%,彩信话单冗余度60.2 %,其他业务数据量相对较小暂未统计。在新的数据存储方案中,每个字段平均冗余3个字节,在普通语音类详单中,39个字段将产生39*3个字节的冗余数据。将上述定长话单中非空格和非换行符的数据量,加上(39*3*话单数)个冗余数据,在与(39*3*话单数)做比计算冗余系数,得到语音在新的话单格式中冗余度约26.7%,短信话单冗余度26.95%,彩信话单冗余度40.2%。可见新的话单编码方式和老编码方式在存储相同数据量的详单数据对比,新编码话单将占用更少的存储资源。对于新编码格式的编码和解码效率,由于简化了数据嵌套关系以及直白的二进制数据存取,在基于新变长话单结构定义的编码/解码API执行效率,在CPU主频1.65GHz的主机上单线程处理效率>10000条/秒,满足电信话单数据处理的要求。


图1为定长式话单格式示意图;图2为树型话单格式示意图;图3为本发明采用的数据编码方法示意图;图4为本发明具体实施例1所述的一种电信话单数据编码方法的流程图;图5为本发明具体实施例2所述的一种电信话单数据解码方法的流程图。
具体实施例方式以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。如图4所示,本发明具体实施例1所述的一种电信话单数据编码方法,具体包括以下步骤:步骤1:安装软件开发包;步骤2:配置软件开发包中的相关环境变量;步骤3:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型;步骤4:按照所述配置文件中保存的不同的电信话单数据的类型,调用内存中预先保存的树型话单结构模型,所述树型话单结构模型与所述电信话单数据的各类型一一对应;步骤5:接收定长型的电信话单数据,判断其所属电信话单数据的类型,并存入与所述电信话单数据的类型相应的树形话单结构模型,生成二维的树型话单结构数据;步骤6:将生成的树型话单结构数据进行序列化操作,编码转换成一维的码流数据;步骤7:完成编码,清理并释放内存。所述步骤2配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本。所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单按名称对应不同的树型话单结构模型,所述树型话单结构模型保存在内存中。所述步骤3中的编码采用直接编码方案,所述编码中标签为8位无符号整型;所述编码中对数值长度的编码为变长无符号整形数;所述编码中数值内容为变长的二进制流。
如图5所示,本发明具体实施例2所述的一种电信话单数据解码方法,具体包括以下步骤:步骤1:安装软件开发包;步骤2:配置软件开发包中的相关环境变量;步骤3:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型;步骤4:读取一条一维的码流数据;步骤5:将一维的码流数据存入内存中,并将码流数据解码转换为二维的树型话单结构数据,并将所述二维的树型话单结构数据的电信话单数据的类型与内存中预先保存的树型话单结构模型类比,匹配出对应的树型话单结构模型;步骤6:识别所述二维的树型话单结构数据对应的电信话单数据的类型,并按照所述电信话单数据的类型和与其相对应的树型话单结构模型将所述树型话单数据处理为定长型的话单数据;步骤7:读取所述定长型的话单数据;步骤8:完成解码,清理并释放内存。所述步骤2配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本。所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单对应不同的树型话单结构模型,所述树型话单结构模型保存在内存中。图1和图2说明了从普通定长话单转换为树型话单的过程。图1描述了一种定长格式的数据组织方式,话单中字段之间先后顺序必须固定,字段位置决定字段含义,字段个数无法灵活扩展。图2则在图1字段的基础上增加若干逻辑控制节点,控制节点中不存储数据,只标识字段之间从属关系。通过控制节点的加入,结合配置文件中对数据结构预定义类型,实现图1中各个字段分组和建立归属关系。图3说明了一种快速编码方案,对应软件开发包的名字为FEDX。这种快速编码方案能够在满足电信领域详单数据特征(记录数多,以千亿计;但单条记录长度不大,一般不超过1MB)的前提下,提供足够高的编解码效率和最小的编解码系统开销。FEDX数据编码方法,采用定长标签,变长数据数值的方式进行编码。编码中标签为8位无符号整型,可以有256种不同编码方式。由于标签在新编码规则的配置文档中定义成上下文相关,当话单结构分为η层时,理论可用标签将有256的η次方个。因此在每个话单子层区分256个不同标签对电信计费行业已经足够。编码中数值长度为变长无符号整型数。如果长度第一个bit位是0,则表示长度占用15bit,如果第一个bit位是1,则表示长度占用31bit。普通电信话单,15bit的长度(32KB)已经满足要求,对特殊应用场景下的复合话单,31bit (2GB)的长度也可满足要求。编码程序不例fedx-params-fedx-param; FILE*fp=NULL;
int Iength=O; unsignedchar*result=NULL;charfieldName[128+1];
charpath [128+1];
charfieldValue[128+1];
fedx-getConf ( “/pkg/cfg/config.xml” );
fedx-paramlni t (&s-fedx-param);
fp=fopen( “/data/test.2008” ,” wb” );
strcpy (fieldName, ” system—type”);
strcpy (path, NULL);
strcpy (fieldValue, ” vc” );
if (fedx-getHeadNode (&s-fedx_param, fieldValue)!=0)
{
fprintf (stderr, "pCurrNodewrong!\n");return-1;
}
if (fedx_SetFieldValueByName (&s_fedx_param, fieldValue, fieldNam e, path) !=U)
{
printf("fedx-setFieldYalueByNamewrong\n");break;
}
strcpy (fieldName, ” msisdn” );
strcpy (path, NULL);
strcpy (fieldValue, ” 13552272654” }
if (fedx-SetFi eldValueByName (&s-fedx-param, fieldValue, fieldNam
e, path) !=Q)

{
printf ("fedx-setFieldValueByNamewrong\n"); break;
}
if(result=fedx-write—mem-record (&s—fedx-parara, &length)!=NULL) {
printf ("fedx-wri te-mem-recordwrong\nM); break;
}
fwri te (result, sizeof (uns ignedchar),length, fp); ff lush (fp);
fedx-freeRecord (&S-fedx_param); fclose (fp);
fedx-freeGlobaIMem ();解码程序示例
fedx-params-fedx-param;
FILE*fp=NULL;
charfieldName[128+1];
charpath [128+1]; charfieldValue [128+1];
fedx—getConf ( “/pkg/cfg/config.xml” );
fedx_paramlni t (&s —fedx—param);
fp=fopen ( “/data/test.2008” ,,,rb” );
while (fedx-1oadMem(&s-fedx-param, fp) !=0)
{if (fedx-getHeadNode (&s-fedx-param, NULL) !=0)
{
fprintf (stderr, "pCurrNodewrong!\n"); return -1;
}
if(fedx-read-raem_record (&S-fedx-param)!=0)
{
pr intf (" fedx-read-mem_recorderrorXn11); break;
}
strcpy(fieldName,” msisdn” ); strcpy (path, NULL);
if(fedx-getFieIdYaIueByName (&s_fedx-param, f ieldValue,f ieldName, path) !=0)
{
pr intf (11 f edx-getFieIdValueByNamewrongXn");
break;
}
fedx-freeRecord (&S-fedx-param);
}
fclose (fp); f edx-f reeGloba IMem ();
return 0;配置文件示例
< xmlversion="l.0" encoding="utf-8" >

<root>
<fedxs>
<versions>
Cversiontaglength=丨丨2" Ienlength=丨丨2H effdate="20000101" expiredate="20501231"/>
</versions>
<headnodes>
〈headnodetag=" I OOl11
systemtypes="vc, vf, gg, ss, ml, mw, mm"/>
〈headnode tag=" 1002" systemtypes=,,gx"/>
</headnodes>
〈nogroupfedxtag=" 1001"datatype='1 seq"
fedxfieldname="nogroupfedx" nodemark="I">
〈nodetag="2001"datatype="ascii"
fedxfleldname="system-type" nodemark="I />
〈nodetag="2002"datatype="ascii"
fcdxficldnamc="msisdn' nodcmark="I"/>
</nogroupfedx>
<groupfedxs>
<groupfedxtag=" 1002'1data type=" seq"
fedxfieldname="gx" nodemark="3">
^uudeltag=1丨2001"datatype=丨,asci i"
f edxf iel dname=" msisdn" nodemark=丨丨 l"/>
<nodeltag="50001"datatype="seq" fedxfleldname="groupl" nodemark="2">
<node2tag="2008"datatype="ascii"
fedxfieldname="start-datetime" nodemark="I"/>
<node2tag="50002"datatype="set"
fedxfieldname="group2" nodemark="I">
<node3tag="4001"datatype="asci i"
fedxfieldname="cfee" nodemark="l"/>
<node3tag="4003"datatype="ascii"
fedxfieldname="I fee" nodemark="I />
</node2>
<node2tag="50003"datatype=丨1 set11
f edxf iel dname=11 g roup 3 ” nodemark=" 2">
<node3tag="400r'datatype="asci i"
fedxf ie ldname=丨丨 cf eeH nodemark=" I />
〈node3tag="4003"datatype="ascii"`f edxf i e I dname=" Ifee" nodemark=” 111/>
</node2>
</nodel>
Cnodeltag="2012"datatype="ASCII"
fedxf ieldname="duration-type" nodemark="In/>
</groupfedx>
</groupfedxs>
</fedxs>
</root>`以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种电信话单数据编码方法,其特征在于,具体包括以下步骤: 步骤1:安装软件开发包; 步骤2:配置软件开发包中的相关变量生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型; 步骤3:按照所述配置文件中保存的不同的电信话单数据的类型,调用内存中预先保存的树型话单结构模型,所述树型话单结构模型与所述电信话单数据的各类型一一对应;步骤4:接收定长型的电信话单数据,判断其所属电信话单数据的类型,并存入与所述电信话单数据的类型相应的树形话单结构模型,生成二维的树型话单结构数据; 步骤5:将生成的树型话单结构数据进行序列化操作,编码转换成一维的码流数据; 步骤6:完成编码,清理并释放内存。
2.根据权利要求1所述一种电信话单数据编码方法,其特征在于,所述步骤2具体包括以下步骤: 步骤2.1:配置软件开发包中的相关环境变量; 步骤2.2:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型。
3.根据权利要求2所述一种电信话单数据编码方法,其特征在于,所述步骤2.1配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本 。
4.根据权利要求3所述一种电信话单数据编码方法,其特征在于,所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单按名称对应不同的树型话单结构模型,所述树型话单结构模型保存在内存中。
5.根据权利要求1-4任一项所述一种电信话单数据编码方法,其特征在于,所述步骤2.2中的编码采用直接编码方案,所述编码中标签为8位无符号整型,可以有256种不同编码方式,由于标签在新编码规则的配置文档中定义成上下文相关,当话单结构分为η层时,可用标签个数有256的η次方个;所述编码中对数值长度的编码为变长无符号整形数;所述编码中数值内容为变长的二进制流。
6.一种电信话单数据解码方法,其特征在于,具体包括以下步骤: 步骤1:安装软件开发包; 步骤2:配置软件开发包中的相关变量生成配置文件,并将配置文件保存入内存,所述配置文件中包括至少三种电信话单数据的类型; 步骤3:读取一条一维的码流数据; 步骤4:将一维的码流数据存入内存中,并将码流数据解码转换为二维的树型话单结构数据,并将所述二维的树型话单结构数据的电信话单数据的类型与内存中预先保存的树型话单结构模型类比,匹配出对应的树型话单结构模型; 步骤5:识别所述二维的树型话单结构数据对应的电信话单数据的类型,并按照所述电信话单数据的类型和与其相对应的树型话单结构模型将所述树型话单数据处理为定长型的电信话单数据; 步骤6:读取所述定长型的电信话单数据; 步骤7:完成解码,清理并释放内存。
7.根据权利要求6所述一种电信话单数据解码方法,其特征在于,所述步骤2具体包括以下步骤: 步骤2.1:配置软件开发包中的相关环境变量; 步骤2.2:调用开发包环境变量进行编码,初始化相关变量和数据,生成配置文件,并将配置文件保存入内存,配置文件中包括至少三种电信话单数据的类型。
8.根据权利要求7所述一种电信话单数据解码方法,其特征在于,所述步骤2.1配置的环境变量包括可扩展标记语言的文件名称、可扩展标记语言的文件路径、软件开发包的安装目录和软件开发包的当前版本。
9.根据权利要求6-8任一项所述一种电信话单数据解码方法,其特征在于,所述配置文件中保存的电信话单类型包括语音话单类型、短信话单类型和视频话单类型,不同类型的电信话单对应不同的树型话单结构模型 ,所述树型话单结构模型保存在内存中。
全文摘要
本发明涉及一种电信话单数据编解码方法,其中一种电信话单数据编码方法,具体包括以下步骤步骤1安装软件开发包;步骤2配置软件开发包中的相关变量生成配置文件;步骤3按照所述配置文件中保存的不同的电信话单数据的类型,调用内存中预先保存的树型话单结构模型;步骤4接收定长型的电信话单数据,生成二维的树型话单结构数据;步骤5将生成的树型话单结构数据编码转换成一维的码流数据;步骤6完成编码,清理并释放内存。本发明所描述的数据编码方法,可有效降低目前计费数据的冗余度,提高数据存储资源的使用率;本编码方法可以规划话单数据不同字段之间从属关系,使话单具备更好的扩展能力;本编码方法编解码效率很高。
文档编号G06F9/44GK103092607SQ201210576748
公开日2013年5月8日 申请日期2012年12月26日 优先权日2012年12月26日
发明者张奇伟 申请人:北京思特奇信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1