C# 一个简单的连续心率血氧压缩算法

自己写的一个简单的压缩算法,但是由于数据源无法保证数据的连续性,和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;
                    }
                }
            }
        }
    }
复制代码

 

posted @   WmW  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示