游程编码的解码逻辑
第一个字节允许值0到15,17,18。
是0到15,记录目标值,计数为1。
是16,报错。
是17,18,目标值为0。暂时不计数。
第二字节到倒数第二字节。
是0到15,分两种情况,一种是计数器,另一种是普通数值,判定条件是前一个字节的数值大于15是计数器。否则是普通数值。
如果是计数器,累加计数值
如果是普通数值,与之前的数值对比,如果相同,累加计数,如果不同,输出之前的序列,并且新数值计数为1。
是16,之前目标数值是非0值不处理,是0,则报错。
是17和18,之前目标数值是0值,不处理,是非0值,输出之前的序列。
最后一个字节,在做之前的工作后,打印这个最后字节的序列。
function code_left()
{var input=[4,16,1,3,3,3,6,16,3,16,0,17,3,2,16,0];
var result=[];
var target_val=0;
var count=0;
for(var i=0;i<input.length;i++)
{
if(i==0)
{
if(input[i]<16){target_val=input[0];
count=1;}
else if(input[i]>16)
{target_val=0;}
}
else
{if(input[i-1]>15)
{
if(input[i-1]==18){count=count+input[i]+11;}
else{count=count+input[i]+3;}
}
else
{
if(input[i]==target_val)
{count=count+1;}
else
{result=write_array(result,target_val,count);
count=1;
target_val=input[i];
}
}
}
if(i==input.length-1)
{
result=write_array(result,target_val,count);
}
}
}
//
function write_array(result,target_val,count)
{
var arr=result;
for(var i=0;i<count;i++)
{arr.push(target_val);}
return arr;
}