自己写的一个简单的压缩算法,但是由于数据源无法保证数据的连续性,和Gzip对比后失去优势,因此最终弃用了,扔了可惜,发布上来看看之后能否用到
/// <summary> /// 心率数据压缩算法,数据特点: /// 1,可以用一个字节表示; /// 2,数值不为0; /// 3,存在大量连续重复的数值 /// 具体算法:对于连续相同超过2个的数值,后面用三个数值表示,第一个数值固定为0,第二个为该数值,第三个为重复的个数(最大255), /// 该算法比较适合每秒心率,血氧之类连续重复性强变化缓慢的的生理数据 /// </summary> public class HRCompressor { /// <summary> /// 压缩 /// </summary> public static IEnumerable<byte> Compress(IEnumerable<byte> values) { foreach ((byte val, byte count) in CutSegment(values)) { if (count == 1) { yield return val; } else if (count == 2) { yield return val; yield return val; } else if (count > 2) { yield return 0; yield return val; yield return count; } } } /// <summary> /// 按照连续相同的数值进行分段 /// </summary> static IEnumerable<(byte, byte)> CutSegment(IEnumerable<byte> values) { byte prev = 0; byte count = 0; foreach (var p in values) { if (p == 0) { throw new Exception("该压缩算法中数值不能为0"); } if (count > 0 && p != prev) { //非第一次连续的2个数值不相等 yield return (prev, count); //返回数值,及其连续的个数 count = 0; } if (count == byte.MaxValue) { //超过最大计数后,返回结果 yield return (prev, count); count = 0; } prev = p; count++; } yield return (prev, count); } /// <summary> /// 解压缩 /// </summary> public static IEnumerable<byte> Decompress(IEnumerable<byte> values) { byte step = 0; byte val = 0; foreach (var p in values) { if (p == 0) { //发现为0后,就说明后续的2个字节,一个是数值,一个是个数 step = 2; } else { if (step == 2) { val = p; step = 1; } else if (step == 1) { for (int i = 0; i < p; i++) { yield return val; //返回指定个数的相同数值 } step = 0; val = 0; } else { yield return p; } } } } }
标签:count,return,血氧,val,C#,yield,数值,byte,压缩算法 From: https://www.cnblogs.com/luludongxu/p/18576863