技术领域
[0001] 本申请涉及计算机技术领域,特别涉及一种编码方法。本申请同时涉及一种编码装置,一种计算设备,以及一种计算机可读存储介质。
相关背景技术
[0002] 随着互联网的发展,无论前后端通讯还是保存文件普遍都用到二进制编码,特别是在即时游戏方面通讯,二进制编码的使用更为频繁。对于一个游戏开发商,服务器编码方式对游戏服务期的带宽是有着举足轻重的影响。在游戏场景中经常通讯的数据,通常为小的整型数字。而目前对这些整型数据进行常规二进制编码(除2取余,并逆序排列的编码方式进行编码)后形成的二进制数据占用的字节数较多。
具体实施方式
[0022] 在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
[0023] 在本申请一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请一个或多个实施例。在本申请一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本申请一个或多个实施例中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。
[0024] 应当理解,尽管在本申请一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
[0025] 首先,对本申请一个或多个实施例涉及的名词术语进行解释。
[0026] 二进制(binary)是在数学和数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)
[0027] 字节是二进制数据的单位。一个字节通常8位长。但是,一些老型号计算机结构使用不同的长度。为了避免混乱,在大多数国际文献中,使用词代替byte。在多数的计算机系统中,一个字节是一个8位长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。一个字节也可以表示一系列二进制位。在一些计算机系统中,4个字节代表一个字,这是计算机在执行指令时能够有效处理数据的单位。一些语言描述需要2个字节表示一个字符,这叫做双字节字符集。一些处理器能够处理双字节或单字节指令。字节通常简写为“B”,而位通常简写为小写“b”,计算机存储器的大小通常用字节来表示
[0028] 比特(BIT,Binary digit),计算机专业术语,是信息量单位,是由英文BIT音译而来。同时也是二进制数字中的位,信息量的度量单位,为信息量的最小单位。在需要做出不同选择的情况下把备选的刺激数量减少半所必需的信息。即信号的信息量(比特数)等于信号刺激量以2为底数的对数值。L.哈特莱1928年认为对信息量选用对数单位进行度量最合适。
[0029] 在本申请中,提供了一种编码方法,本申请同时涉及一种编码装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
[0030] 图1示出了根据本申请一实施例提供的一种编码方法的流程图,具体包括以下步骤:
[0031] 步骤102:获取整数类型的目标数据对应的二进制数据。
[0032] 具体的,整数类型可以是短整型、整型或长整型等数据类型。目标数据可以是整数类型的整数,比如,68、24、150等。具体实施时,为了实现对目标数据的编码优化,可以先获取其他设备发送的目标数据对应的二进制数据,也可以获取当前设备中的目标数据对应的二进制数据,并在获取的二进制数据的基础上进行编码优化,在此不做限制。
[0033] 其中,二进制数据是指对目标数据进行二进制编码之后生成的二进制格式的数据。在通信系统中,经常使用二进制格式对信息或数据进行编码,并在将信息或数据编码成为二进制数据后,再对二进制数据进行存储或传输等处理。具体实施时,对目标数据进行二进制编码,可以理解为通过常规现有技术对目标数据进行编码。
[0034] 进一步的,因为不同类型的数据具有不同的特性,并且不同类型的数据通常采用不同的二进制编码方式进行编码,比如整数类型的数据通常采用除2取余,并逆序排列的二进制编码方式进行编码,而浮点类型的数据采用另一种二进制编码方法进行编码。而采用不同的编码方式进行编码后生成的二进制数据具有不同的规律,比如整数类型的数据在进行常规的二进制编码后所形成的二进制数据中的高位比特位(二进制位)中的连续的0是无意义的。本申请实施例为了减少无意义的0对空间的占用,对现有的对整数类型的二进制编码方式提供了一种编码优化方案。
[0035] 实际应用中,考虑到大部分场景中对于整数类型的小数字的使用率远远大于整数类型的大数字,而对目标数据进行二进制编码后获得的二进制数据所占用的字节数,取决于目标数据的数据类型。若目标数据是短整型,对短整型的目标数据进行二进制编码后的二进制数据占用固定2个字节;若目标数据是整型,对整型的目标数据进行二进制编码后的二进制数据固定占用4个字节;若目标数据是长整型,对长整型的目标数据进行二进制编码后的二进制数据固定占用8个字节。但对于小数字来说,它们对应的二进制数据占用的字节中大部分的高位二进制位是无实际意义的(即无效的),若采用常规的二进制编码方式对这些小数字进行编码,则会浪费一部分空间存储无意义的二进制位。
[0036] 进一步的,在与终端进行数据传输的过程中,对这些小数字对应的二进制数据进行传输,会导致占用较多的带宽。为了减少与终端在传输过程中的宽带占用,本申请实施例,获取整数类型的目标数据,并对该目标数据进行二进制编码,获得目标数据对应的二进制数据,以便对整数类型的目标数据对应的二进制数据进行编码优化,从而减少与终端通讯过程中的带宽占用,提高与终端的通讯速度,降低网络延迟。
[0037] 比如,目标数据为123456,通过除2取余,并逆序排列的二进制编码方式进行二进制编码,获得的二进制数据为“00000000 00000001 11100010 01000000”。
[0038] 步骤104:截取所述二进制数据的有效二进制位获得二进制位序列,并对所述二进制位序列进行二进制位划分处理获得二进制位分组。
[0039] 在上述获取目标数据对应的二进制数据的基础上,为了对该二进制数据进行压缩,减少该二进制数据中无意义的二进制位(高位连续的0)的数量,对该二进制数据中的有效二进制位进行截取,获得二进制位序列。但截取的二进制位序列可能不满原本的字节数,若计算机仍旧按原本的字节数对数据进行识别,则可能导致识别错误的情况,因此为了使计算机明确该数据所占用的字节数,需要对二进制位序列重新进行二进制位划分处理,以便在重新划分获得的二进制位分组中补充二进制位,使计算机根据补充的二进制位识别当前数据所占用的字节数。
[0040] 其中,有效二进制位,是指二进制数据中值具有明确含义的二进制位,具体的,针对整数类型的数据对应的二进制数据,有效二进制位是指二进制数据中除高位连续的0之外的其他二进制位。在截取的有效二进制位的基础上,获得二进制位序列,其中,二进制位序列是指将截取的有效二进制位按照在二进制数据中的排列顺序进行拼接形成的序列。
[0041] 在获得二进制位序列的基础上,由于常规编码方式需要根据数据的数据类型,确定对应的编码字节数,而本申请实施例对原本固定长度的字节数进行了改变,因此还需要通过二进制位对二进制位序列占据的字节数进行标识,具体实施时,可以先对二进制位序列划分分组,再以分组作为雏形的字节,基于这些雏形的字节进行字节数标识,以完成对目标数据的编码优化。
[0042] 具体实施时,由于对二进制位序列进行二进制位划分的划分方式,直接影响获得目标数据的编码结果的编码效率、准确性以及压缩比例。为了提高对目标数据的编码效率以及编码准确性,可以按照预设划分位数对二进制位序列进行分组,本申请实施例提供的一种可选实施方式中,具体实现方式如下所述:
[0043] 截取所述二进制数据的有效二进制位,获得所述二进制数据中的有效二进制位组成的二进制位序列;
[0044] 按照预设划分位数对所述二进制位序列进行二进制位划分处理,获得至少一个二进制位分组。
[0045] 其中,预设划分位数,是指预先设置的对二进制位进行划分的粒度,比如预设划分位数为7,则以7个二进制位为一组对二进制数据进行划分;假设预设划分位数为5,则以5个二进制位为一组对二进制数据进行划分。此外,预设划分位数还可以为8等,在此不做限制。
[0046] 具体实施时,可以对二进制位序列在从低位到高位的方向上按照预设划分位数进行二进制位划分处理。在二进制位序列中的二进制位数量小于预设划分位数的情况下,则将该二进制位序列直接作为一个二进制位分组;在划分完成之后,若在二进制位序列中还存在小于预设划分位数的二进制位,则将这些二进制位直接作为一个二进制位分组。
[0047] 实际应用中,在通过截取有效二进制位,获得所述二进制数据中的有效二进制位组成的二进制位序列的基础上,再对二进制位进行分组,由于按照预设划分位数对二进制位序列进行二进制位划分处理后,获得的至少一个二进制位分组中二进制位的位数可能不满8位。而缺少的二进制位数,则可以用于补充对字节数量进行标识的二进制位。因此,实际应用中是根据所采用的对目标数据占用字节的标识策略,选用对二进制位序列的二进制位划分方式。
[0048] 沿用上例,对二进制数据“00000000 00000001 11100010 01000000”中的有效位进行截取,获得的二进制位序列为“1 11100010 01000000”,在预设划分位数为7的情况下,将二进制位序列从右到左划分为3个二进制位分组,这3个二进制位分组分别为:“111”、“1000100”以及“1000000”。
[0049] 综上,按照预设划分位数对有效二进制位组成的二进制位序列进行二进制位划分处理,实现了通过简单的运算,对二进制位序列进行分组,提高了分组效率,也进一步提高了对目标数据的编码效率。
[0050] 此外,为了避免对二进制位序列进行分组占用计算资源,还可以将二进制位序列作为一个整体,对其进行字节数标识,截取所述二进制数据的有效二进制位获得二进制位序列之后,还可以通过如下方式实现对二进制位序列进行编码优化:
[0051] 确定二进制位序列中包含的二进制位的有效位数;
[0052] 根据所述有效位数,确定所述二进制位序列中的二进制位占用的字节数;
[0053] 基于所述字节数以及所述目标数据的整数类型,确定所述二进制序列对应的第三补充二进制位;
[0054] 基于所述二进制位序列和所述第三补充二进制位进行拼接,获得所述目标数据对应的第二目标编码数据。
[0055] 具体的,基于二进制位序列中包含的二进制位的位数(即有效位数),确定当前序列中二进制位占用的字节数,再确定二进制序列对应的字节数标识位(即第三补充二进制位)。
[0056] 实际应用中,由于在目标数据为短整型的情况下,对目标数据进行二进制编码后的二进制数据占用固定2个字节;在目标数据为整型的情况下,对目标数据进行二进制编码后的二进制数据固定占用4个字节;在目标数据为长整型的情况下,对目标数据进行二进制编码后的二进制数据固定占用8个字节。可知,短整型的目标数据在常规编码后的有效二进制位组成的二进制位序列最多占用2个字节;整型的目标数据在常规编码后的有效二进制位组成的二进制位序列最多占用4个字节;长整型的目标数据在常规编码后的有效二进制位组成的二进制位序列最多占用8个字节。再加上需要补充的第三补充二进制位,则短整型的目标数据在常规编码后的有效二进制位组成的二进制位序列与第三补充二进制位拼接最多占用3个字节;整型的目标数据在常规编码后的有效二进制位组成的二进制位序列与第三补充二进制位拼接最多占用5个字节;长整型的目标数据在常规编码后的有效二进制位组成的二进制位序列与第三补充二进制位拼接最多占用9个字节。
[0057] 因此,对于短整型,第三补充二进制位需要标识的字节数最多为3,则这种情况下第三补充二进制位至少需要2位二进制位;对于整型,第三补充二进制位需要标识的字节数最多为5,则这种情况下第三补充二进制位至少需要3位二进制位;对于长整型,第三补充二进制位需要标识的字节数最多为9,则这种情况下第三补充二进制位至少需要4位二进制位。
[0058] 基于此,基于二进制序列中二进制位占用的字节数以及所述目标数据的整数类型,即可确定所述二进制序列对应的字节数标记位(即第三补充二进制位)。再基于二进制序列与第三补充二进制位进行拼接,具体的,可以按照二进制序列在首置位(排列在前),第三补充二进制位在末置位(排列在后)的方式,将二进制序列与第三补充二进制位进行拼接;还可以按照二进制序列在末置位,第三补充二进制位在首置位的方式,将二进制序列与第三补充二进制位进行拼接,在此不做限制,拼接完成后即可获得最终的编码结果,即第二目标编码数据。
[0059] 需要说明的是,由于计算机识别的是完整的字节数,因此在二进制序列与第三补充二进制位拼接后的二进制位不满足完整字节的情况下,还需要在二进制序列和第三补充二进制位之间补充足够数量的0,以保障目标编码数据占用完整的字节数。
[0060] 沿用上例,在二进制数据为“00000000 00000001 11100010 01000000”的基础上,截取该二进制数据中的有效位组成的二进制位序列为“1 11100010 01000000”,该二进制位序列中二进制位占用的字节数为3,而在目标数据的整数类型为整型的情况下,则可以确定第三补充二进制位为3位,具体的,这3位补充二进制位为010表示3个字节,则按照第三补充二进制位在首置位,二进制位序列在末置位的方式进行拼接,获得拼接序列“00101 11100010 01000000”,而拼接序列并不是完整的字节数,还差3位二进制位,因此在二进制序列和第三补充二进制位之间补充3位0,补充完成后,获得目标数据123456对应的第二目标编码数据“00100001 11100010 01000000”,并且第二目标编码数据占用3个字节,比原本整型的目标数据进行二进制编码后少占用1个字节。
[0061] 综上,基于字节数以及所述目标数据的整数类型,确定由有效二进制位组成的二进制序列对应的第三补充二进制位,再基于二进制序列和第三补充二进制位进行拼接,生成目标数据的第二目标编码数据,降低了绝大多数的目标数据的编码数据所占用的字节数,并进一步节约了存储空间以及数据传输带宽。
[0062] 步骤106:根据所述二进制位分组在二进制位序列中的排列顺序,确定所述二进制位分组对应的补充二进制位。
[0063] 在上述对二进制位序列进行二进制位划分处理,获得二进制位分组的基础上,为了基于二进制位分组,对目标数据的编码结果进行字节标识。可以根据二进制位分组在二进制位序列中的排列顺序,确定二进制位分组对应的补充二进制位,通过补充二进制位对当前数据占用的字节进行标识。
[0064] 其中,补充二进制位,可以是在二进制位分组中选取至少一个二进制位分组添加补充二进制位。比如,只需对排序在首位的二进制位分组,确定对应的补充二进制位;或者只需对排列在末位的二进制位分组,确定对应的补充二进制位等,在此不做限制。此外,也可以对每个二进制位分组添加补充二进制位。实际应用中,可以根据实际需要选取补充二进制位的方式,在此不做限制。
[0065] 实际应用中,上述划分二进制位分组以及补充二进制位的位数,都可以根据所采用的对目标数据占用字节的标识策略进行确定。比如,对目标数据占用字节的标识策略:在每个字节中通过1个二进制位标识占用(关联)字节。则在上述按照7位1组的方式对二进制数据进行二进制位划分的基础上,确定每个分组对应的补充二进制位为1位。
[0066] 进一步的,考虑到如果补充二进制位太多,会增加编码结果占用的字节数,而实际场景中如果可以确定编码结果的终止位置(末位),即可确定编码结果所占用的字节数。因此,可以采用对在二进制位序列中的排序顺序排列在末位的分组,确定一种补充二进制位,并对非末位的分组确定另一种补充二进制位的方式,对编码结果的字节数进行标识,本申请实施例提供的一种可选实施方式中,具体实现方式如下所述:
[0067] 确定所述二进制位分组在二进制位序列中的排列顺序;
[0068] 在所述排列顺序为末位的情况下,确定所述二进制位分组对应的补充二进制位为第一数值;
[0069] 在所述排列顺序为非末位的情况下,确定所述二进制位分组对应的补充二进制位为第二数值。
[0070] 实际应用中,对二进制位序列进行二进制位划分的时候,为了不影响二进制位之间的关联关系,通常是按照二进制位在二进制位序列中的排列顺序进行分组。也因此,分组后获得的二进制位分组在二进制位序列中仍然存在排列顺序。
[0071] 进一步的,在二进制位分组的排列顺序为末位的情况下,表明后面的字节与当前数据(目标数据)不是一体的,则可确定二进制位分组对应的补充二进制位为第一数值。在二进制位分组的排列顺序为非末位的情况下,表明后面的字节与当前数据是一体的,则可确定二进制位分组对应的补充二进制位为第二数值。具体实施时,可以第一数值为0,第二数值为1;也可以第一数值为1,第二数值为0,在此不做限制。
[0072] 沿用上例,获得的3个二进制位分组为:“111”、“1000100”以及“1000000”,这3个分组中“1000000”在二进制位序列“1 11100010 01000000”中的排列顺序为末位,则确定二进制位分组“1000000”对应的补充二进制位为“0”,二进制位分组“111”、“1000100”在二进制位序列“1 11100010 01000000”中的排列顺序为非末位,则确定二进制位分组“111”以及二进制位分组“1000100”对应的补充二进制位为“1”。
[0073] 综上,根据二进制位分组在二进制序列中的排列顺序,即可确定每个分组对应的补充二进制位,并可以根据该补充二进制位明确该二进制位分组后面的字节与当前数据是否为一体的,实现了对目标数据所占用的字节进行标识。
[0074] 步骤108:基于所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,根据拼接结果生成所述目标数据对应的目标编码数据。
[0075] 具体的,在上述确定补充二进制位的基础上,将补充二进制以及补充二进制位对应的二进制位分组中的二进制位进行拼接,是为了形成字节,并进一步根据形成的字节生成二进制数据对应的目标编码数据。其中,目标编码数据是对目标数据进行编码最终生成的编码结果。
[0076] 具体实施时,考虑到目标编码数据必须是由完整的字节组成,而实际场景中,仅将补充二进制以及补充二进制位对应的二进制位分组中的二进制位进行拼接,获得的拼接结果可能并不满足字节所需二进制位。为了保障目标编码数据的格式需求,需要对不满足字节所需的二进制位,再补充二进制位,本申请实施例提供的一种可选实施方式中,具体实现方式如步骤S1082‑S1086:
[0077] 步骤S1082,计算所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位的位数之和。
[0078] 具体的,对补充二进制位的位数以及补充二进制位对应的二进制位分组中的二进制位的位数进行求和,是为了判断位数之和是否满足一个字节中要求的二进制位数。
[0079] 步骤S1084,在所述位数之和不小于预设位数的情况下,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组;
[0080] 具体的,预设位数,是指一个完整的字节中要求的二进制位数。在位数之和不小于预设位数的情况下,表明补充二进制位与该补充二进制位对应的二进制位分组中的二进制位的结合已经满足字节所要求二进制位数,因此,无需再补充二进制位。则直接将补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组。
[0081] 进一步的,考虑到通过多种方式进行拼接所形成的二进制位拼接分组,并不影响对目标数据的编码,因此,为了增加编码的灵活性以及多样性,实现补充二进制位以及补充二进制位对应的二进制位分组中的二进制位进行拼接,本申请实施例提供的一种可选实施方式中,具体实现方式如下所述:
[0082] 按照所述补充二进制位在末置位,所述补充二进制位对应的二进制位分组中的二进制位在首置位的顺序,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,获得二进制位拼接分组;或按照所述补充二进制位在首置位,所述补充二进制位对应的二进制位分组的二进制位在末置位的顺序,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,获得二进制位拼接分组。
[0083] 其中,首置位,是指在排列在前的位置,末置位是指排列在后的位置。
[0084] 步骤S1086,在所述位数之和小于预设位数的情况下,根据所述预设位数和所述位数之和之间的位数差值,确定第二补充二进制位;将所述补充二进制位、所述补充二进制位对应的二进制位分组中的二进制位以及所述第二补充二进制位按照第二预设顺序进行拼接,获得二进制位拼接分组。在位数之和小于预设位数的情况下,表明补充二进制位与该补充二进制位对应的二进制位分组中的二进制位的结合仍然不满足字节所要求二进制位数,因此,需要进一步计算补充二进制位与该补充二进制位对应的二进制位分组中的二进制位的结合,还差多少二进制位数,即计算预设位数和位数之和之间的位数差值,该位数差值,表明需要补充多少位二进制位,并基于位数差值确定还需要补充的二进制位(即第二补充二进制位),即第二补充二进制位的位数为位数差值。
[0085] 需要说明的是,由于第二补充二进制位并没有实际意义,仅为了满足字节所需的二进制位数,因此,可以将每位第二补充二进制位确定为0。基于此,再将补充二进制位、补充二进制位对应的二进制位分组中的二进制位以及第二补充二进制位按照第二预设顺序进行拼接,获得二进制位拼接分组,具体实施时,该第二预设顺序可以是补充二进制位在首置位(可以理解为排列在前的位置),第二补充二进制位在中间置位(可以理解为排列在中间的位置),补充二进制位对应的二进制位分组中的二进制位在末置位(可以理解为排列在后的位置);该第二预设顺序还可以是补充二进制位对应的二进制位分组中的二进制位在首置位,补充二进制位在中间置位,第二补充二进制位在末置位;进一步的,再基于第二预设顺序进行拼接,获得二进制位拼接分组。
[0086] 沿用上例,对于二进制位分组“111”,计算二进制位分组“111”中二进制位与对应的补充二进制位“1”的位数之和为4。在预设位数为8的情况下,位数之和小于预设位数,则确定预设位数和位数之和的位数差值为4,则确定第二补充二进制位为“0000”,并按照补充二进制位在首置位,第二补充二进制位在中间置位,补充二进制位对应的二进制位分组中的二进制位在末置位的顺序,将补充二进制位“1”、第二补充二进制位为“0000”以及二进制位分组“111”中二进制位进行拼接,获得二进制位拼接分组“10000111”。
[0087] 对于二进制位分组“1000100”,计算二进制位分组“1000100”中二进制位与对应的补充二进制位“1”的位数之和为8,在预设位数为8的情况下,位数之和等于预设位数,则直接将补充二进制位“1”以及二进制位分组“1000100”中二进制位进行拼接,获得二进制位拼接分组“11000100”。类似地,对于二进制位分组“1000000”,计算二进制位分组“1000000”中二进制位与对应的补充二进制位“0”的位数之和为8,在预设位数为8的情况下,位数之和等于预设位数,则直接将补充二进制位“0”以及二进制位分组“1000000”中二进制位进行拼接,获得二进制位拼接分组“01000000”。
[0088] 综上,在进行拼接之前,先计算补充二进制位以及补充二进制位对应的二进制位分组中的二进制位的位数之和是否小于预先位数,并在补充二进制位以及补充二进制位对应的二进制位分组中的二进制位的位数之和小于预设位数的情况下,确定满足预设位数需要补充的第二补充二进制位,并在此基础上按照预设的拼接顺序进行拼接获得二进制位拼接分组,保障了每个二进制位拼接分组都满足字节所需的二进制位。
[0089] 进一步的,在上述获得二进制位拼接分组的基础上,由于获得的二进制位拼接分组可能是多个,并且多个二进制位拼接分组之间是彼此独立的,因此,需要对多个二进制位拼接分组进行组合,生成二进制数据对应的目标编码数据,本申请实施例提供的一种可选实施方式中,具体实现方式如下所述:
[0090] 根据所述二进制位拼接分组的排列顺序对所述二进制位拼接分组进行组合,生成所述目标数据对应的目标编码数据。
[0091] 具体的,由于二进制位拼接分组是在二进制位分组中的二进制位的基础上拼接其他二进制位的方式形成的,因此,二进制位拼接分组的排列顺序和二进制位分组排列顺序是相同的。基于此,再将二进制位拼接分组进行组合,形成一个完整的编码数据,即目标编码数据。
[0092] 沿用上例,在获得二进制拼接分组“10000111”、“11000100”以及“01000000”的基础上,将二进制拼接分组按照“10000111”在前,“11000100”在中间,“01000000”在后的顺序进行组合,获得目标数据123456对应的目标编码数据:“10000111 11000100 01000000”。
[0093] 综上,根据二进制位拼接分组的排列顺序对二进制位拼接分组进行组合,生成目标数据对应的目标编码数据,保障了目标编码数据的准确性。
[0094] 此外,除上述根据拼接结果生成目标数据对应的目标编码数据之外,由于预设划分位数为7位,补充二进制位为1位的情况下,将补充二进制位以及补充二进制位对应的二进制位分组中的二进制位按照预设顺序进行拼接之后,只有排在第一位的二进制位拼接分组有可能小于预设位数,因此,为了避免判断二进制位分组中的二进制位与补充二进制位的位数之和是否满足预设位数,从而提高编码效率,本申请实施例提供的一种可选实施方式中,具体实现方式如下所述:
[0095] 将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组;
[0096] 确定所述二进制位拼接分组中排在第一位的二进制位拼接分组中的二进制位的位数;
[0097] 在所述位数小于预设位数的情况下,根据所述预设位数和所述位数之间的位数差值,确定第二补充二进制位;
[0098] 将所述第二补充二进制位插入排在第一位的二进制位拼接分组中的补充二进制位和二进制位分组中二进制位的中间;
[0099] 根据二进制位拼接分组的排列顺序对所述二进制位拼接分组进行组合,生成所述目标数据对应的目标编码数据。
[0100] 实际应用中,在预设划分位数为7位,补充二进制位为1位的情况下,划分出二进制位分组除了排在第一位的二进制位分组中包含的二进制位可能不是7位之外,其他二进制位分组中包含的7位二进制位与补充二进制位拼接后,获得的二进制位拼接分组的位数都不小于预设位数,因此无需再确定第二补充二进制位。其中第二补充二进制位,可以理解为没有实际意义的二进制位,用于使二进制位拼接分组中的二进制位满足一个完整字节所需的二进制位。
[0101] 因此,只需要确定二进制位拼接分组中排在第一位的二进制位拼接分组中的二进制位的位数是否满足预设位数,并在不满足预设位数(即小于预设位数的情况下,根据所述预设位数和所述位数之间的位数差值,确定第二补充二进制位,在将第二补充二进制位插入排在第一位的二进制位拼接分组中,具体的,将第二补充二进制位插入排在第一位的二进制位拼接分组中的补充二进制位和二进制位分组中二进制位的中间,避免了随机插入影响二进制位分组中二进制位的数据表示。并在完成数据插入的基础上,将二进制位拼接分组按照其排列顺序进行组合,生成目标编码数据。
[0102] 比如,在上述确定各个二进制位分组对应的补充二进制位的基础上,将二进制位分组:“111”与其对应的补充二进制位“1”进行拼接,获得二进制位拼接分组“1111”;将二进制位分组“1000100”与其对应的补充二进制位“1”进行拼接,获得二进制位拼接分组“11000100”;将二进制位分组“1000000”与其对应的补充二进制位“0”进行拼接,获得二进制位拼接分组“01000000”;其中,二进制位拼接分组“1111”为排在第一位的二进制位拼接分组,该二进制位拼接分组中二进制位的位数为4位,则计算预设位数8与该位数的位数差值为4,并根据位数差值,确定第二补充二进制位为4位的0,即“0000”。将这4位补充二进制位插入二进制位拼接分组“1111”中的补充二进制位和二进制位分组中二进制位的中间,获得更新后的二进制位拼接分组“10000111”,将该二进制位拼接分组“10000111”与上述两个二进制位拼接分组“11000100”以及二进制位拼接分组“01000000”按照排列顺序进行组合,获得目标编码数据,该目标编码数据为“10000111 11000100 01000000”。
[0103] 综上,仅判断排在第一位的二进制位拼接分组中二进制位是否满足预设位数,并在不满足的情况下,插入第二补充二进制位,提升了编码效率。
[0104] 需要说明的是,按照上述编码方式生成的目标编码数据占用的字节数是可变长度的,而按照常规二进制编码方式生成的二进制数据占用的字节数是固定长度的,实际场景下各种整数类型的数据通过常规二进制编码方式进行编码生成的二进制数据,和通过本申请方案进行编码生成的目标编码数据,所占用的字节数具体如下表1所示:
[0105] 表1
[0106] 数据类型 二进制数据占用字节数 目标编码数据占用字节数Short(短整型) 2个字节 1~3个字节
Int(整型) 4个字节 1~5个字节
Long(长整型) 8个字节 1~10个字节
[0107] 进一步的,以目标数据为1、127、128、255、123456为例,将对目标数据通过常规二进制编码方式进行编码生成的二进制数据,和通过本申请方案进行编码生成的目标编码数据,所占用的字节数具体如下表2所示:
[0108] 表2
[0109]目标数据 二进制数据占用字节数 目标编码数据占用字节数
1 4字节 1个字节
127 4字节 1个字节
128 4字节 2个字节
255 4字节 2个字节
123456 4字节 3个字节
[0110] 在上述获取发送终端发送整数类型的目标数据对应的二进制数据的基础上,考虑到服务端面对的接收终端通常比较多,并且传输的整数中通常小数字比较多,在根据拼接结果生成所述目标数据对应的目标编码数据之后,将所述目标编码数据发送至至少一个接收终端。可以减少与接收终端传输的数据量,从而减少与接收终端通讯过程中的带宽占用,提高与接收终端的通讯速度,降低网络延迟。
[0111] 此外,还存在服务端给接收终端发送目标数据的场景,也可以先将目标数据通过上述编码方式进行编码后,再发送至接收终端。其中,接收终端,可以是任意设备终端,比如手机、平板电脑、台式电脑等设备,在此不做限制。
[0112] 以游戏场景为例,接收终端可以理解为客户端,在用户通过客户端登录之和,服务器需要向客户端发送用户的角色信息,这些信息普遍是由一系列整数类型的数据构成的,比如:exp(经验值):“150”,level(等级):“4”,使用上述编码方式对角色信息中的整数进行编码,可以获得比常用编码方式更小的字节占用。
[0113] 再比如,某角色的一系列位移坐标是30,50,10,170(这些数据为整型数据),现有技术的常规编码方式会把这一系列位移编码成:“00000000 00000000 00000000 00011110”,“00000000 00000000 00000000 00110010”,“00000000 00000000 00000000
00001010”,“00000000 00000000 00000000 10101010”,编码后的二进制数据占用了128位;而采用本申请实施例的编码方法,则会把这些位移坐标编码成:“00011110”,“00110010”,“00001010”,“10000001 00101010”,这些编码后数据共占用40位。由于本方案根据编码数字可动态调整输出的二进制位的位数,不同于传统编码方式针对整型固定输出
32位的编码数据,节省了极大部分的字节。
[0114] 综上所述,本申请提供的编码方法,通过获取整数类型的目标数据对应的二进制数据,再截取二进制数据的有效二进制位获得二进制位序列,并对二进制位序列进行二进制位划分处理获得二进制位分组,在二进制位分组的基础上,根据二进制位分组在二进制位序列中的排列顺序,确定所述二进制位分组对应的补充二进制位;最后基于补充二进制位以及补充二进制位对应的二进制位分组中的二进制位进行拼接,根据拼接结果生成所述目标数据对应的目标编码数据。实现了对常规二进制编码方式的优化,优化后的目标编码数据占用的字节数较少,并进一步压缩了存储空间,降低了传输带宽。
[0115] 下述结合附图2,以本申请提供的编码方法在游戏场景中的应用为例,对所述编码方法进行进一步说明。其中,图2示出了本申请一实施例提供的一种应用于游戏场景中的编码方法的处理流程图,具体包括以下步骤:
[0116] 步骤202:获取正整数类型的目标数据对应的二进制数据。
[0117] 实际应用中,游戏服务器需要发送战报数据给游戏客户端播放,这些战报数据中包括一系列位移以及血量改变的数据,这些位移以及血量改变的数据通常是正整数类型的小数字,本申请实施例,将这些正整数类型的小数字作为目标数据,并对这些进行除2取余,并逆序排列的二进制编码方式进行编码,获得目标数据对应的二进制数据。
[0118] 具体的,在正整型数据的目标数据为200以及601的情况下,服务器将这两个数据作为目标数据,并以每个数字4个字节来编码,获得目标数据200对应的二进制数据为“00000000 00000000 00000000 11001000”,以及目标数据601对应的二进制数据为“00000000 00000000 00000010 01011001”。
[0119] 步骤204:截取所述二进制数据的有效二进制位,获得所述二进制数据中的有效二进制位组成的二进制位序列。
[0120] 具体的,截取目标数据200对应的二进制数据“00000000 00000000 00000000 11001000”中的有效二进制位,获得该二进制数据中的二进制位序列为“11001000”,以及截取目标数据601对应的二进制数据“00000000 0000000 000000010 01011001”中的有效二进制位,获得该二进制数据中的二进制位序列为“10 01011001”。
[0121] 步骤206:按照预设划分位数对所述二进制位序列进行二进制位划分处理,获得至少一个二进制位分组。
[0122] 具体的,在预设划分位数为7的情况下,对上述获得的二进制位序列“11001000”进行二进制位划分处理,获得两个二进制位分组,这两个二进制位分组分别为“1”以及“1001000”;以及对上述获得的二进制位序列“1001011001”,获得两个二进制位分组,这两个二进制位分组分别为:“100”以及“1011001”。
[0123] 步骤208:确定每个二进制位分组在所属的二进制位序列中的排列顺序。
[0124] 具体的,确定二进制位分组“1”在其所属的二进制位序列中排在首位,并确定二进制位分组“1001000”在其所属的二进制位序列中排在末位;以及确定二进制位分组“100”在其所属的二进制位序列中排在首位,并确定二进制位分组“1011001”在其所属的二进制位序列中排在末位。
[0125] 步骤210:针对每个二进制位分组,在所述排列顺序为末位的情况下,确定所述二进制位分组对应的补充二进制位为第一数值。
[0126] 具体的,二进制位分组“1001000”在其所属的二进制位序列中排在末位,则确定二进制位分组“1001000”对应的补充二进制位为0;类似地,二进制位分组“1011001”在其所属的二进制位序列中排在末位,则确定二进制位分组“1011001”对应的补充二进制位为0。
[0127] 步骤212:针对每个二进制位分组,在所述排列顺序为非末位的情况下,确定所述二进制位分组对应的补充二进制位为第二数值。
[0128] 具体的,二进制位分组“1”在其所属的二进制位序列中的排列顺序为非末位,则确定二进制位分组“1”对应的补充二进制位为1;类似地,二进制位分组“100”在其所属的二进制位序列中的排列顺序为非末位,则确定二进制位分组“100”对应的补充二进制位为1。
[0129] 步骤214:将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组。
[0130] 具体的,在第一预设顺序为补充二进制位为首置位,二进制位分组中的二进制位为末置位的情况下,将上述步骤210以及上述步骤212中确定的补充二进制位与补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得目标数据200对应的二进制位拼接分组分别为:“11”以及“01001000”,以及获得目标数据601对应的二进制位拼接分组分别为:“1100”以及“01011001”。
[0131] 步骤216:确定所述二进制位拼接分组中排在第一位的二进制位拼接分组中的二进制位的位数。
[0132] 具体的,确定目标数据200对应的二进制位拼接分组中排在第一位的二进制拼接分组中二进制位:“11”的位数为2;以及确定目标数据601对应的二进制位拼接分组中排在第一位的二进制拼接分组中二进制位:“1100”的位数为4。
[0133] 步骤218:在所述位数小于预设位数的情况下,根据所述预设位数和所述位数之间的位数差值,确定第二补充二进制位。
[0134] 具体的,在预设位数为8的情况下,基于上述确定的二进制拼接分组中二进制位:“11”的位数为2,计算预设位数和该位数的位数差值为6,则确定第二补充二进制位为“000000”;以及基于上述确定的二进制拼接分组中二进制位:“1100”的位数为4,计算预设位数和该位数的位数差值为4,则确定第二补充二进制位为“0000”。
[0135] 步骤220:将所述第二补充二进制位插入排在第一位的二进制位拼接分组中的补充二进制位和二进制位分组中二进制位的中间。
[0136] 具体的,在确定第二补充二进制位的基础上,将上述确定的第二补充二进制位“000000”插入排在第一位的二进制位拼接分组“11”中补充二进制位和二进制位分组中二进制位的中间,获得的更新后的二进制位拼接分组“10000001”;以及将上述确定的第二补充二进制位“0000”插入排在第一位的二进制位拼接分组“1100”中补充二进制位和二进制位分组中二进制位的中间,获得的更新后的二进制位拼接分组“10000100”。
[0137] 步骤222:根据二进制位拼接分组的排列顺序对所述二进制位拼接分组进行组合,生成所述目标数据对应的目标编码数据。
[0138] 具体的,根据目标数据200对应的二进制位拼接分组的排列顺序,对二进制位拼接分组“10000001”,“01001000”进行组合,生成目标数据200对应的目标编码数据“1000000101001000”;以及根据目标数据601对应的二进制位拼接分组的排列顺序,对二进制位拼接分组“10000100”,“01011001”进行组合,生成目标数据200对应的目标编码数据“10000100 01011001”。
[0139] 步骤224:将所述目标编码数据发送至至少一个接收终端。
[0140] 具体的,将上述生成的目标编码数据“10000001 01001000”以及“10000100 01011001”发送至至少一个游戏客户端(即接收终端)。
[0141] 实际应用中,接收终端基于接收到的目标编码数据进行解码,并将解码后的数据在接收终端的游戏界面中进行展示,具体的,图3示出了游戏客户端的游戏界面示意图,其中,游戏界面中角色的血量变化为解码后的数据。
[0142] 综上所述,本申请提供的编码方法,通过获取整数类型的目标数据对应的二进制数据,再截取二进制数据的有效二进制位获得二进制位序列,并对二进制位序列进行二进制位划分处理获得二进制位分组,在二进制位分组的基础上,根据二进制位分组在二进制位序列中的排列顺序,确定所述二进制位分组对应的补充二进制位;最后基于补充二进制位以及补充二进制位对应的二进制位分组中的二进制位进行拼接,根据拼接结果生成所述目标数据对应的目标编码数据。实现了对常规二进制编码方式的优化,优化后的目标编码数据占用的字节数较少,并进一步压缩了存储空间,降低了传输带宽。
[0143] 与上述方法实施例相对应,本申请还提供了编码装置实施例,图4示出了本申请一实施例提供的一种编码装置的结构示意图。如图4所示,该装置包括:
[0144] 获取模块402,被配置为获取整数类型的目标数据对应的二进制数据;
[0145] 划分模块404,被配置为截取所述二进制数据的有效二进制位获得二进制位序列,并对所述二进制位序列进行二进制位划分处理获得二进制位分组;
[0146] 确定模块406,被配置为根据所述二进制位分组在二进制位序列中的排列顺序,确定所述二进制位分组对应的补充二进制位;
[0147] 拼接模块408,被配置为基于所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,根据拼接结果生成所述目标数据对应的目标编码数据。
[0148] 可选地,所述划分模块404,进一步被配置为:
[0149] 截取所述二进制数据的有效二进制位,获得所述二进制数据中的有效二进制位组成的二进制位序列;
[0150] 按照预设划分位数对所述二进制位序列进行二进制位划分处理,获得至少一个二进制位分组。
[0151] 可选地,所述确定模块406,进一步被配置为:
[0152] 确定所述二进制位分组在二进制位序列中的排列顺序;
[0153] 在所述排列顺序为末位的情况下,确定所述二进制位分组对应的补充二进制位为第一数值;
[0154] 在所述排列顺序为非末位的情况下,确定所述二进制位分组对应的补充二进制位为第二数值。
[0155] 可选地,所述拼接模块408,包括:
[0156] 计算子模块,被配置为计算所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位的位数之和;
[0157] 第一拼接子模块,被配置为在所述位数之和不小于预设位数的情况下,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组;
[0158] 第二拼接子模块,被配置为在所述位数之和小于预设位数的情况下,根据所述预设位数和所述位数之和之间的位数差值,确定第二补充二进制位;将所述补充二进制位、所述补充二进制位对应的二进制位分组中的二进制位以及所述第二补充二进制位按照第二预设顺序进行拼接,获得二进制位拼接分组。
[0159] 可选地,所述拼接模块408,进一步被配置为:
[0160] 根据所述二进制位拼接分组的排列顺序对所述二进制位拼接分组进行组合,生成所述目标数据对应的目标编码数据。
[0161] 可选地,所述第一拼接子模块,进一步被配置为:
[0162] 按照所述补充二进制位在末置位,所述补充二进制位对应的二进制位分组中的二进制位在首置位的顺序,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,获得二进制位拼接分组;或
[0163] 按照所述补充二进制位在首置位,所述补充二进制位对应的二进制位分组的二进制位在末置位的顺序,将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位进行拼接,获得二进制位拼接分组。
[0164] 可选地,所述拼接模块408,进一步被配置为:
[0165] 将所述补充二进制位以及所述补充二进制位对应的二进制位分组中的二进制位按照第一预设顺序进行拼接,获得二进制位拼接分组;
[0166] 确定所述二进制位拼接分组中排在第一位的二进制位拼接分组中的二进制位的位数;
[0167] 在所述位数小于预设位数的情况下,根据所述预设位数和所述位数之间的位数差值,确定第二补充二进制位;
[0168] 将所述第二补充二进制位插入排在第一位的二进制位拼接分组中的补充二进制位和二进制位分组中二进制位的中间;
[0169] 根据二进制位拼接分组的排列顺序对所述二进制位拼接分组进行组合,生成所述目标数据对应的目标编码数据。
[0170] 可选地,所述编码装置,还包括:
[0171] 确定位数模块,被配置为确定二进制位序列中包含的二进制位的有效位数;
[0172] 确定字节数模块,被配置为根据所述有效位数,确定所述二进制位序列中的二进制位占用的字节数;
[0173] 确定第三补充二进制位模块,被配置为基于所述字节数以及所述目标数据的整数类型,确定所述二进制序列对应的第三补充二进制位;
[0174] 二进制位拼接模块,被配置为基于所述二进制位序列和所述第三补充二进制位进行拼接,获得所述目标数据对应的第二目标编码数据。
[0175] 可选地,所述获取模块402,进一步被配置为:
[0176] 获取整数类型的目标数据;
[0177] 对所述目标数据进行二进制编码,获得目标数据对应的二进制数据;
[0178] 相应地,所述编码装置,还包括:
[0179] 发送模块,被配置为将所述目标编码数据发送至至少一个接收终端。
[0180] 综上所述,本申请提供的编码装置,通过获取整数类型的目标数据对应的二进制数据,再截取二进制数据的有效二进制位获得二进制位序列,并对二进制位序列进行二进制位划分处理获得二进制位分组,在二进制位分组的基础上,根据二进制位分组在二进制位序列中的排列顺序,确定所述二进制位分组对应的补充二进制位;最后基于补充二进制位以及补充二进制位对应的二进制位分组中的二进制位进行拼接,根据拼接结果生成所述目标数据对应的目标编码数据。实现了对常规二进制编码方式的优化,优化后的目标编码数据占用的字节数较少,并进一步压缩了存储空间,降低了传输带宽。
[0181] 上述为本实施例的一种编码装置的示意性方案。需要说明的是,该编码装置的技术方案与上述的编码方法的技术方案属于同一构思,编码装置的技术方案未详细描述的细节内容,均可以参见上述编码方法的技术方案的描述。
[0182] 图5示出了根据本说明书一个实施例提供的一种计算设备500的结构框图。该计算设备500的部件包括但不限于存储器510和处理器520。处理器520与存储器510通过总线530相连接,数据库550用于保存数据。
[0183] 计算设备500还包括接入设备540,接入设备540使得计算设备500能够经由一个或多个网络560通信。这些网络的示例包括公用交换电话网(PSTN)、局域网(LAN)、广域网(WAN)、个域网(PAN)或诸如因特网的通信网络的组合。接入设备540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC))中的一个或多个,诸如IEEE802.11无线局域网(WLAN)无线接口、全球微波互联接入(Wi‑MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC)接口,等等。
[0184] 在本说明书的一个实施例中,计算设备500的上述部件以及图5中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图5所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
[0185] 计算设备500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备500还可以是移动式或静止式的服务器。
[0186] 其中,处理器520用于执行所述计算机指令时实现所述的编码方法的步骤。
[0187] 上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的编码方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述编码方法的技术方案的描述。
[0188] 本申请一实施例还提供一种计算机可读存储介质,其存储有计算机指令,所述计算机指令被处理器执行时实现如前所述编码方法的步骤。
[0189] 上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的编码方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述编码方法的技术方案的描述。
[0190] 上述对本申请特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0191] 所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
[0192] 需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本申请所必须的。
[0193] 在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
[0194] 以上公开的本申请优选实施例只是用于帮助阐述本申请。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本申请的内容,可作很多的修改和变化。本申请选取并具体描述这些实施例,是为了更好地解释本申请的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本申请。本申请仅受权利要求书及其全部范围和等效物的限制。