当前位置: 首页 > news >正文

一款实用的.NET Core加密解密工具类库

图片

前言

在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。

项目介绍

NETCore.Encrypt是.NET Core加密解密工具类库,包括AES、RSA、MD5、SHA1、DES、SHA256、SHA384、SHA512等更多功能。

项目源码

图片

图片

MD5加密

封装方法

        #region MD5/// <summary>/// MD5 hash/// </summary>/// <param name="srcString">The string to be encrypted.</param>/// <param name="length">The length of hash result , default value is <see cref="MD5Length.L32"/>.</param>/// <returns></returns>public static string Md5(string srcString, MD5Length length = MD5Length.L32){Check.Argument.IsNotEmpty(srcString, nameof(srcString));string str_md5_out = string.Empty;using (MD5 md5 = MD5.Create()){byte[] bytes_md5_in = Encoding.UTF8.GetBytes(srcString);byte[] bytes_md5_out = md5.ComputeHash(bytes_md5_in);str_md5_out = length == MD5Length.L32? BitConverter.ToString(bytes_md5_out): BitConverter.ToString(bytes_md5_out, 4, 8);str_md5_out = str_md5_out.Replace("-", "");return str_md5_out;}}#endregion

调用结果

        public static void MD5_Test(){var srcString = "追逐时光者";var hashed = EncryptProvider.Md5(srcString);Console.WriteLine("MD5加密结果:" + hashed);}

图片

图片

RSA加密&解密

封装方法

        /// <summary>/// RSA encrypt/// </summary>/// <param name="publicKey">public key</param>/// <param name="srcString">src string</param>/// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>/// <param name="isPemKey">set key is pem format,default is false</param>/// <returns>encrypted string</returns>public static string RSAEncrypt(string publicKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false){Check.Argument.IsNotEmpty(publicKey, nameof(publicKey));Check.Argument.IsNotEmpty(srcString, nameof(srcString));Check.Argument.IsNotNull(padding, nameof(padding));RSA rsa;if (isPemKey){rsa = RsaProvider.FromPem(publicKey);}else{rsa = RSA.Create();rsa.FromJsonString(publicKey);}using (rsa){var maxLength = GetMaxRsaEncryptLength(rsa, padding);var rawBytes = Encoding.UTF8.GetBytes(srcString);if (rawBytes.Length > maxLength){throw new OutofMaxlengthException($"'{srcString}' is out of max encrypt length {maxLength}", maxLength, rsa.KeySize, padding);}byte[] encryptBytes = rsa.Encrypt(rawBytes, padding);return encryptBytes.ToHexString();}}/// <summary>/// RSA decrypt/// </summary>/// <param name="publicKey">public key</param>/// <param name="srcString">src string</param>/// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>/// <param name="isPemKey">set key is pem format,default is false</param>/// <returns>encrypted string</returns>public static string RSADecrypt(string privateKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false){Check.Argument.IsNotEmpty(privateKey, nameof(privateKey));Check.Argument.IsNotEmpty(srcString, nameof(srcString));Check.Argument.IsNotNull(padding, nameof(padding));RSA rsa;if (isPemKey){rsa = RsaProvider.FromPem(privateKey);}else{rsa = RSA.Create();rsa.FromJsonString(privateKey);}using (rsa){byte[] srcBytes = srcString.ToBytes();byte[] decryptBytes = rsa.Decrypt(srcBytes, padding);return Encoding.UTF8.GetString(decryptBytes);}}

调用结果

        #region Rsa加密&解密public static void Rsa_Encrypt_Decrypt_Test(RsaSize size){var rsaKey = EncryptProvider.CreateRsaKey(size);var srcString = "追逐时光者";var encrypted = EncryptProvider.RSAEncrypt(rsaKey.PublicKey, srcString);Console.WriteLine("RSA加密结果:" + encrypted);Console.WriteLine("\r\n");var decrypted = EncryptProvider.RSADecrypt(rsaKey.PrivateKey, encrypted);Console.WriteLine("RSA解密结果:" + decrypted);}#endregion

图片

DES加密&解密

封装方法

        /// <summary>/// DES encrypt/// </summary>/// <param name="data">Raw data byte array</param>/// <param name="key">Key, requires 24 bits</param>/// <param name="vector">IV,requires 8 bits</param>/// <returns>Encrypted byte array</returns>public static byte[] DESEncrypt(byte[] data, string key, string vector){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 24, nameof(key));Check.Argument.IsNotEmpty(vector, nameof(vector));Check.Argument.IsEqualLength(vector.Length, 8, nameof(vector));return DESEncrypt(data, key, CipherMode.CBC, vector);}/// <summary>/// DES encrypt/// </summary>/// <param name="data">Raw data</param>/// <param name="key">Key, requires 24 bits</param>/// <param name="cipherMode"><see cref="CipherMode"/></param>/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>/// <param name="vector">IV,requires 8 bits</param>/// <returns>Encrypted byte array</returns>private static byte[] DESEncrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 24, nameof(key));using (MemoryStream Memory = new MemoryStream()){using (TripleDES des = TripleDES.Create()){byte[] plainBytes = data;byte[] bKey = new byte[24];Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);des.Mode = cipherMode;des.Padding = paddingMode;des.Key = bKey;if (cipherMode == CipherMode.CBC){byte[] bVector = new byte[8];Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);des.IV = bVector;}using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateEncryptor(), CryptoStreamMode.Write)){try{cryptoStream.Write(plainBytes, 0, plainBytes.Length);cryptoStream.FlushFinalBlock();return Memory.ToArray();}catch (Exception ex){return null;}}}}}/// <summary>/// DES encrypt/// </summary>/// <param name="data">Raw data byte array</param>/// <param name="key">Key, requires 24 bits</param>/// <param name="vector">IV,requires 8 bits</param>/// <returns>Encrypted byte array</returns>public static byte[] DESDecrypt(byte[] data, string key, string vector){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 24, nameof(key));Check.Argument.IsNotEmpty(vector, nameof(vector));Check.Argument.IsEqualLength(vector.Length, 8, nameof(vector));return DESDecrypt(data, key, CipherMode.CBC, vector);}/// <summary>/// DES decrypt/// </summary>/// <param name="data">Encrypted data</param>/// <param name="key">Key, requires 24 bits</param>/// <param name="cipherMode"><see cref="CipherMode"/></param>/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>/// <returns>Decrypted byte array</returns>private static byte[] DESDecrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 24, nameof(key));byte[] encryptedBytes = data;byte[] bKey = new byte[24];Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);using (MemoryStream Memory = new MemoryStream(encryptedBytes)){using (TripleDES des = TripleDES.Create()){des.Mode = cipherMode;des.Padding = paddingMode;des.Key = bKey;if (cipherMode == CipherMode.CBC){byte[] bVector = new byte[8];Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);des.IV = bVector;}using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateDecryptor(), CryptoStreamMode.Read)){try{byte[] tmp = new byte[encryptedBytes.Length];int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length);byte[] ret = new byte[len];Array.Copy(tmp, 0, ret, 0, len);return ret;}catch{return null;}}}}}

调用结果

        #region DES加密&解密public static void DES_Encrypt_Decrypt_Test(){var srcString = "TEST DES Encrypt Decrypt";string key = EncryptProvider.CreateDesKey();string iv = EncryptProvider.CreateDesIv();var srsDatas = Encoding.UTF8.GetBytes(srcString);var encrypted = EncryptProvider.DESEncrypt(srsDatas, key, iv);Console.WriteLine("DES加密结果:" + encrypted); Console.WriteLine("\r\n");var decrypted = EncryptProvider.DESDecrypt(encrypted, key, iv);var decryptedStr = Encoding.UTF8.GetString(decrypted);Console.WriteLine("DES解密结果:" + decryptedStr);}#endregion

图片

AES加密&解密

封装方法

        /// <summary>/// AES encrypt ( no IV)/// </summary>/// <param name="data">Raw data</param>/// <param name="key">Key, requires 32 bits</param>/// <returns>Encrypted string</returns>public static string AESEncrypt(string data, string key){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 32, nameof(key));using (MemoryStream memory = new MemoryStream()){using (Aes aes = Aes.Create()){byte[] plainBytes = Encoding.UTF8.GetBytes(data);byte[] bKey = new byte[32];Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);aes.Mode = CipherMode.ECB;aes.Padding = PaddingMode.PKCS7;aes.KeySize = 256;aes.Key = bKey;using (CryptoStream cryptoStream = new CryptoStream(memory, aes.CreateEncryptor(), CryptoStreamMode.Write)){try{cryptoStream.Write(plainBytes, 0, plainBytes.Length);cryptoStream.FlushFinalBlock();return Convert.ToBase64String(memory.ToArray());}catch (Exception ex){return null;}}}}}/// <summary>/// AES decrypt( no IV)/// </summary>/// <param name="data">Encrypted data</param>/// <param name="key">Key, requires 32 bits</param>/// <returns>Decrypted string</returns>public static string AESDecrypt(string data, string key){Check.Argument.IsNotEmpty(data, nameof(data));Check.Argument.IsNotEmpty(key, nameof(key));Check.Argument.IsEqualLength(key.Length, 32, nameof(key));byte[] encryptedBytes = Convert.FromBase64String(data);byte[] bKey = new byte[32];Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);try{byte[] decryptedData = null; // decrypted datausing (MemoryStream memory = new MemoryStream(encryptedBytes)){using (Aes aes = Aes.Create()){aes.Mode = CipherMode.ECB;aes.Padding = PaddingMode.PKCS7;aes.KeySize = 256;aes.Key = bKey;using (CryptoStream decryptor = new CryptoStream(memory, aes.CreateDecryptor(), CryptoStreamMode.Read)){using (MemoryStream tempMemory = new MemoryStream()){byte[] buffer = new byte[1024];Int32 readBytes = 0;while ((readBytes = decryptor.Read(buffer, 0, buffer.Length)) > 0){tempMemory.Write(buffer, 0, readBytes);}decryptedData = tempMemory.ToArray();return Encoding.UTF8.GetString(decryptedData);}}}}}catch{return null;}}

调用结果

        #region AES加密&解密public static void Aes_Encrypt_Decrypt_Test(){var aesKey = EncryptProvider.CreateAesKey();var key = aesKey.Key;var srcString = "追逐时光者";var encrypted = EncryptProvider.AESEncrypt(srcString, key);Console.WriteLine("AES加密结果:" + encrypted);Console.WriteLine("\r\n");var decrypted = EncryptProvider.AESDecrypt(encrypted, key);Console.WriteLine("AES解密结果:" + decrypted);}#endregion

图片

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

https://github.com/myloveCc/NETCore.Encrypt

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

相关文章:

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…...

C/C++内存布局

1. C 结构体的内存布局 以一个例子来看struct的内存结构 #define NP_FUNC_WRAPPER __attribute__((optimize(0)))struct StructBody {int first_int_placeholder;int second_int_placeholder;double third_double_placeholder; };class ClassBody {public:int first_int_place…...

springboot(ssm母婴全程服务管理系统 母婴用品服务商城Java系统

springboot(ssm母婴全程服务管理系统 母婴用品服务商城Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xf…...

修改SSH默认端口,使SSH连接更安全

以CentOS7.9为例&#xff1a; 1、修改配置文件 vi /etc/ssh/sshd_config 2、远程电脑可连接&#xff0c;暂时将SELinux关闭 # 查询状态 getenforce # 关闭 setenforce 0 # 开启 setenforce 1 3、SELinux设置&#xff08;如果启用&#xff09;&#xff0c;semanage管理工具安…...

React16源码: React中调度之requestWork的源码实现

requestWork 1 &#xff09;概述 在 scheduleWork 中&#xff0c;找到了创建更新的fiber对应的root节点然后对它进行了一些操作之后&#xff0c;调用了 requestWork&#xff0c;开始请求工作在 requestWork 里面它会做哪些东西呢&#xff1f; 首先我们要把这个root节点加入到调…...

【白话机器学习的数学】读书笔记(3)学习分类(感知机、逻辑回归)

三、学习分类 1.分类的目的 找到一条线把白点和黑点分开。这条直线是使权重向量成为法线向量的直线。(解释见下图) 直线的表达式为&#xff1a; ω ⋅ x ∑ i 1 n ω i ⋅ x i 0 \omegax \sum_{i1}^n\omega_i x_i 0 ω⋅xi1∑n​ωi​⋅xi​0 ω \omega ω是权重向量权…...

书生·浦语大模型实战营-学习笔记3

目录 (3)基于 InternLM 和 LangChain 搭建你的知识库1. 大模型开发范式&#xff08;RAG、Fine-tune&#xff09;RAG微调 &#xff08;传统自然语言处理的方法&#xff09; 2. LangChain简介&#xff08;RAG开发框架&#xff09;3. 构建向量数据库4. 搭建知识库助手5. Web Demo部…...

MySQL下对[库]的操作

目录 创建数据库 创建一个数据库案例&#xff1a; 字符集和校验规则&#xff1a; 默认字符集&#xff1a; 默认校验规则&#xff1a; 查看数据库支持的字符集&#xff1a; 查看数据库支持的字符集校验规则&#xff1a; 校验规则对数据库的影响&#xff1a; 操作数据…...

Django(七)

1.靓号管理 1.1 表结构 根据表结构的需求&#xff0c;在models.py中创建类&#xff08;由类生成数据库中的表&#xff09;。 class PrettyNum(models.Model):""" 靓号表 """mobile models.CharField(verbose_name"手机号", max_len…...

AT24C02读写操作 一

//AT24C02初始化 void AT24C02_Init(void) { IIC_Init(); } //AT24C02的字节写入 写一个字节 void AT24C02_WordWrite(uint8_Address,uint8_t Data) { //1。主机发送开始信号 IIC_StartSignal(); //2.主机发送器件地址 写操作 IIC_SentBytes(0xA0); //3.主机等侍从机应…...

.NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务

在这篇文章中&#xff0c;我们将了解 .NET 8 中为托管服务引入的一些新生命周期事件。请注意&#xff0c;这篇文章与 .NET 8 相关&#xff0c;在撰写本文时&#xff0c;.NET 8 目前处于预览状态。在 11 月 .NET 8 最终版本发布之前&#xff0c;类型和实现可能会发生变化。要继续…...

Redis--Geo指令的语法和使用场景举例(附近的人功能)

文章目录 前言Geo介绍Geo指令使用使用场景&#xff1a;附近的人参考文献 前言 Redis除了常见的五种数据类型之外&#xff0c;其实还有一些少见的数据结构&#xff0c;如Geo&#xff0c;HyperLogLog等。虽然它们少见&#xff0c;但是作用却不容小觑。本文将介绍Geo指令的语法和…...

127.0.0.1和0.0.0.0的区别

在网络开发中&#xff0c;经常会涉及到两个特殊的IP地址&#xff1a;127.0.0.1和0.0.0.0。这两者之间有一些关键的区别&#xff0c;本文将深入介绍它们的作用和用途。 127.0.0.1 127.0.0.1 是本地回环地址&#xff0c;通常称为 “localhost”。作用是让网络应用程序能够与本地…...

SpringBoot ES 聚合后多字段加减乘除

SpringBoot ES 聚合后多字段加减乘除 在SpringData Elasticsearch中&#xff0c;聚合统计的原理主要依赖于Elasticsearch本身的聚合框架。Elasticsearch提供了强大的聚合功能&#xff0c;使得你可以对文档进行各种计算和统计&#xff0c;从而得到有关数据集的有用信息。 Elast…...

React16源码: React中requestCurrentTime和expirationTime的源码实现补充

requestCurrentTime 1 &#xff09;概述 关于 currentTime&#xff0c;在计算 expirationTime 和其他的一些地方都会用到 从它的名义上来讲&#xff0c;应等于performance.now() 或者 Date.now() 就是指定的当前时间在react整体设计当中&#xff0c;它是有一些特定的用处和一些…...

【论文阅读】Deep Graph Contrastive Representation Learning

目录 0、基本信息1、研究动机2、创新点3、方法论3.1、整体框架及算法流程3.2、Corruption函数的具体实现3.2.1、删除边&#xff08;RE&#xff09;3.2.2、特征掩盖&#xff08;MF&#xff09; 3.3、[编码器](https://blog.csdn.net/qq_44426403/article/details/135443921)的设…...

设计模式-简单工厂

设计模式-简单工厂 简单工厂模式是一个集中管理对象创建&#xff0c;并根据条件生成所需类型对象的设计模式&#xff0c;有助于提高代码的复用性和维护性&#xff0c;但可能会导致工厂类过于复杂且违反开闭原则。 抽象提取理论&#xff1a; 封装对象创建过程解耦客户端与产品…...

Django ORM 中的单表查询 API(1)

在 Django 中&#xff0c;对象关系映射&#xff08;ORM&#xff09;提供了一种功能强大、表现力丰富的数据库交互方式。ORM 允许开发人员使用高级 Python 代码执行数据库查询&#xff0c;从而更轻松地处理数据库实体。 下面&#xff0c;我们将探讨 Django ORM 中单表查询 API …...

电子雨html代码

废话不多说下面是代码&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Code</title><style>body{margin: 0;overflow: hidden;}</style></head><body><c…...

xadmin基于Django的后台管理系统安装与使用

xadmin是基于Django的后台管理系统 官网&#xff1a;http://sshwsfc.github.io/xadmin/ github地址&#xff1a;https://github.com/sshwsfc/xadmin 安装方式 pip安装 pip install xadmin在setting配置中添加&#xff1a; INSTALLED_APPS [xadmin,crispy_forms, ]在urls.py…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...