惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
博客园_首页
量子位
Jina AI
Jina AI
S
SegmentFault 最新的问题
IT之家
IT之家
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏
N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
S
Securelist
Google Online Security Blog
Google Online Security Blog
P
Privacy International News Feed
博客园 - Franky
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
C
Cisco Blogs
V
Vulnerabilities – Threatpost
腾讯CDC
The Hacker News
The Hacker News
K
Kaspersky official blog
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
Scott Helme
Scott Helme
B
Blog
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - WmW

C#学习牛顿迭代法开方 mysql将一个表中指定时间之后的新数据导入到另一个表中 使用具体时间和DateTime.Now运算时需要注意DateTime.Now的毫秒数 简单搭建一个 ASP.NET Core Web API + Mysql + SqlSugar demo项目 C# 学习研究CRC校验 C# 学习逆变和协变 C# 标准的Dispose模式 C# 返回Task或者Task<T>的方法中如果没有异步方法,就没必要使用async修饰 关于字节序的概念加深 C# 基于ReadOnlySequence和ReadOnlySequenceSegment的简单封装 简单接触BCD码,以及使用C#简单实现BCD转换 C# ReadOnlySequence和ReadOnlySequenceSegment简单使用 C# 非常简单的文字转语音实现 C# 输出年龄和属相列表 C# 封装了一个用来对参数值进行范围限制的泛型方法 C# 为WindowsDefender防火墙已经存在的入站规则添加IP地址 C# 将Framework4.8控制台程序注册为windows服务 C# async void 方法中使用await时外部不会等待 C# Channel学习 C# 使用字符串分割字符串 C# 将日期时间按照ISO 8601标准转成字符串 Dapper传递参数对象时,只支持属性,无法解析字段(出现Parameter '?id' must be defined)
C# 一个简单的连续心率血氧压缩算法
WmW · 2024-11-29 · via 博客园 - WmW

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