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

推荐订阅源

P
Privacy International News Feed
WordPress大学
WordPress大学
Security Latest
Security Latest
Cyberwarzone
Cyberwarzone
K
Kaspersky official blog
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
G
GRAHAM CLULEY
N
News | PayPal Newsroom
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
美团技术团队
J
Java Code Geeks
I
Intezer
The Cloudflare Blog
SecWiki News
SecWiki News
S
Secure Thoughts
Microsoft Azure Blog
Microsoft Azure Blog
V2EX - 技术
V2EX - 技术
C
Cyber Attacks, Cyber Crime and Cyber Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
D
DataBreaches.Net
S
Security Affairs
Help Net Security
Help Net Security
S
Securelist
F
Full Disclosure
C
Check Point Blog
F
Fortinet All Blogs
Know Your Adversary
Know Your Adversary
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
人人都是产品经理
人人都是产品经理
博客园_首页
G
Google Developers Blog
Google Online Security Blog
Google Online Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Hacker News: Front Page
L
LINUX DO - 热门话题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog

博客园 - 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;
                    }
                }
            }
        }
    }