关于学习笔记:前后端交互

<article class=“article fmt article-content”><h2>前后端交互</h2><h3>前端是什么?</h3><p>前端是指与用户间接交互的局部,通常是指 Web 开发中的前端局部,也称为客户端或用户界面。前端开发波及创立网站或应用程序的用户界面,包含网页的外观、布局、交互和性能。</p><p>简略来说就是:用户的可见界面,数据展现在页面上出现给用户。</p><h3>后端是什么?</h3><p>后端是指网站、应用程序或服务的背地局部,负责解决数据、逻辑和与数据库交互等工作。它包含服务器端技术、数据库和应用程序,确保零碎的稳定性、安全性和性能。</p><h3>前后端交互的组织架构</h3><p>前后端交互的组织架构通常是基于<strong>客户端-服务器模型</strong>,其中前端作为客户端,后端作为服务器端。这种模型通过 HTTP 协定或其余通信协议实现通信。</p><p>在典型的 Web 应用程序中,前端和后端通过 HTTP 申请和响应进行通信。前端发送申请给后端,后端解决申请并返回相应的数据或后果,而后前端依据返回的数据更新用户界面。这种交互模式使得前端和后端可能拆散开发、测试和保护,进步了零碎的灵活性和可维护性。</p><h3>前后端交互的流程</h3><p>前后端交互的流程通常波及以下步骤:</p><ol><li><p><strong>前端发送申请</strong>:</p><ul><li>用户在浏览器中输出网址或者与页面交互,触发前端发送申请的动作。</li><li>前端能够应用HTTP申请向后端发送申请,申请的内容能够包含获取数据、提交表单、执行操作等。</li></ul></li><li><p><strong>后端接管申请</strong>:</p><ul><li>后端服务器接管到前端发送的申请。</li><li>后端服务器依据申请的内容,确定须要执行的操作或提供的服务。</li></ul></li><li><p><strong>后端解决申请</strong>:</p><ul><li>后端依据申请的类型和内容,执行相应的业务逻辑解决。</li><li>这可能包含拜访数据库、调用其余服务、计算数据等。</li></ul></li><li><p><strong>后端生成响应</strong>:</p><ul><li>后端解决完申请后,生成相应的数据或后果。</li><li>这些数据能够是动静生成的HTML、JSON、XML等格局的数据,用于更新前端页面或提供给前端应用程序。</li></ul></li><li><p><strong>后端发送响应</strong>:</p><ul><li>后端将生成的响应数据发送回前端。</li><li>通常,后端会应用HTTP响应来发送数据,包含响应状态码、头部信息以及响应体。</li></ul></li><li><p><strong>前端接管响应</strong>:</p><ul><li>前端浏览器或应用程序接管到后端发送的响应。</li><li>前端解析响应数据,依据须要更新页面内容、执行相应的操作等。</li></ul></li><li><p><strong>前端解决响应</strong>:</p><ul><li>前端依据接管到的响应数据进行解决,可能包含更新页面内容、显示提示信息、执行跳转等操作。</li></ul></li><li><p><strong>用户交互或页面更新</strong>:</p><ul><li>用户在前端页面上进行交互,或者依据前端的更新内容进行操作。</li><li>页面依据用户的操作或后端响应的更新进行相应的更新和交互。</li></ul></li></ol><p>这些步骤形成了前后端交互的根本流程。在理论利用中,依据具体的业务需要和技术架构,可能会有更多的细节和复杂性。</p><h3>传输协定</h3><p>在前后端交互的过程中,罕用的传输协定次要是 HTTP(Hypertext Transfer Protocol)和其平安版本HTTPS(HTTP Secure)。这两种协定是<strong>应用层协定</strong>,<strong>用于在客户端和服务器之间传输数据</strong>。</p><ul><li><strong>HTTP</strong>:客户端发送申请给服务器,服务器解决申请并返回相应的数据或后果。HTTP是基于文本的协定,通常应用TCP作为传输层协定,应用端口号80。</li><li><strong>HTTPS</strong>:HTTPS 是 HTTP 的平安版本,它通过应用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协定来加密数据,从而爱护数据的安全性和完整性。HTTPS 应用的端口号为443。</li></ul><p>在前后端交互中,通常应用 HTTP 申请来获取数据、提交表单、执行操作等。HTTPS 则用于在不平安的网络中加密数据传输,以避免数据被窃取或篡改。HTTPS 的应用能够通过在服务器上安装 SSL/TLS 证书来实现,这样就能够建设平安的加密通道,确保数据在传输过程中的安全性。</p><p><strong>拓展:</strong></p><p><strong>SSL</strong>(Secure Sockets Layer)和 <strong>TLS</strong>(Transport Layer Security)都是<strong>加密通信协议</strong>,用于爱护网络通信的安全性。TLS 实际上是 SSL 的继任者。</p><ul><li><p><strong>SSL(安全套接字层)</strong>:</p><ul><li>SSL 最后由网景公司开发,用于爱护 Web 通信的平安。</li><li>SSL 协定应用加密算法和身份验证来确保数据在客户端和服务器之间的传输平安。</li><li>SSL 协定有多个版本,然而因为安全漏洞和弱点,当初曾经被 TLS 协定所取代。</li></ul></li><li><p><strong>TLS(传输层平安)</strong>:</p><ul><li>TLS 是 SSL 的降级版本,旨在提供更强的安全性和性能。</li><li>TLS 协定继承了 SSL 的根本个性,但修复了 SSL 中存在的一些安全漏洞,并增加了新的性能和加密算法。</li><li>TLS 协定的最新版本是 TLS 1.3,它提供了更快的握手过程、更平安的加密算法和更好的性能。</li></ul></li></ul><p>TLS 协定和 SSL 协定都应用在应用层和传输层之间,它们次要用于爱护 Web 通信、电子邮件传输、VPN 连贯等。当客户端和服务器建设连贯时,它们应用 SSL/TLS 协定进行握手,并协商密钥替换算法、加密算法和其余平安参数。一旦握手胜利,客户端和服务器之间的通信就会通过加密通道进行,确保数据的安全性和完整性。SSL 和 TLS 协定的应用对于互联网通信的平安至关重要,尤其是在敏感信息的传输过程中。</p><h3>域名</h3><p>域名是互联网上用来辨认特定网络资源的名称。它是由一串字符组成的人类可读的标识符,用于代表互联网上的服务器或者网站。域名通常用于辨认特定的网络资源,比方网站、FTP服务器(提供文件存储和拜访服务的计算机)、电子邮件服务器等。</p><p>域名通常由两局部组成:</p><ol><li><strong>域名标签(Domain Label)</strong>:域名的每个局部被称为域名标签或子域名。在典型的域名中,这些标签之间用点号(.)分隔。例如,在域名 “example.com” 中,“example” 是一个子域名,“com” 是顶级域名(TLD)。</li><li><strong>顶级域名(Top-Level Domain, TLD)</strong>:顶级域名是域名体系结构中的最高级别域名。它位于域名的最初局部,用于示意域名的类别或国家/地区。常见的顶级域名包含 “.com”、".org"、".net"、".edu"、".gov" 等以及各国家/地区的顶级域名,如 “.cn”、".uk"、".jp" 等。</li></ol><p>域名的作用在于简化了互联网资源的拜访,因为人们更容易记住具备意义的域名而不是一长串数字组成的IP地址。域名零碎(DNS)将域名翻译成相应的IP地址,这样计算机能力找到正确的网络资源。</p><p>总之,域名在互联网上扮演着重要的角色,是连贯用户和网络资源之间的要害。通过域名,用户能够轻松地拜访网站、发送电子邮件和拜访其余网络服务。</p><h3>端⼝号</h3><p>端口号是一种逻辑标识,用于辨别计算机中不同应用程序或服务之间的通信端口。在计算机网络中,每个应用程序或服务都须要通过端口号来与其余应用程序或服务通信。</p><p>端口号的范畴是从0到65535,其中0到1023是为零碎保留的,用于一些常见的服务或协定,比方HTTP通常应用端口号80,HTTPS通常应用端口号443。其余的端口号则用于自定义的应用程序或服务。</p><p>一些常见的端口号和对应的服务包含:</p><ul><li>80:HTTP服务</li><li>443:HTTPS服务</li><li>21:FTP服务</li><li>22:SSH服务</li><li>25:SMTP服务(用于发送邮件)</li><li>110:POP3服务(用于接管邮件)</li><li>3306:MySQL数据库服务</li><li>5432:PostgreSQL数据库服务</li></ul><p>通过端口号,计算机能够将网络数据包调配给正确的应用程序或服务,从而实现不同应用程序之间的通信和合作。</p></article> ...

February 20, 2024 · 1 min · jiezi

关于学习笔记:吴恩达神经网络和深度学习Chapter3学习笔记

昨天那篇过了一天才审核通过,心愿当前能够略微快一点哈哈始终胆战心惊怕思否感觉我太小白了不给过。明天把第二周的根底作业实现了,难度不大。今天写选做作业。不出意外的话这周能够把神经网络和深度学习这门课刷完。 3.1~3.5这几节次要是解释计算和一些公式上的习惯标记,以及和向量相干的解释,因为太多数学公式懒得打,就不整顿了。 3.6~3.8 激活函数激活函数:深度学习笔记:如何了解激活函数?(附罕用激活函数)查了几篇文章,都提到了一个中央“激活函数将非线性个性引入到咱们的网络中”。 *问题是,为什么咱们不能在不激活输出信号的状况下实现此操作呢?如果咱们不使用激活函数的话,则输入信号将仅仅是一个简略的线性函数。线性函数一个一级多项式。现如今,线性方程是很容易解决的,然而它们的复杂性无限,并且从数据中学习简单函数映射的能力更小。一个没有激活函数的神经网络将只不过是一个线性回归模型(Linear regression Model)罢了,它功率无限,并且大多数状况下执行得并不好。咱们心愿咱们的神经网络不仅仅能够学习和计算线性函数,而且还要比这简单得多。同样是因为没有激活函数,咱们的神经网络将无奈学习和模仿其余简单类型的数据,例如图像、视频、音频、语音等。这就是为什么咱们要应用人工神经网络技术,诸如深度学习(Deep learning),来了解一些简单的事件,一些相互之间具备很多暗藏层的非线性问题,而这也能够帮忙咱们理解简单的数据。那么为什么咱们须要非线性函数?非线性函数是那些一级以上的函数,而且当绘制非线性函数时它们具备曲率。当初咱们须要一个能够学习和示意简直任何货色的神经网络模型,以及能够将输出映射到输入的任意简单函数。神经网络被认为是通用函数近似器(Universal Function Approximators)。这意味着他们能够计算和学习任何函数。简直咱们能够想到的任何过程都能够示意为神经网络中的函数计算。而这所有都归纳于这一点,咱们须要利用激活函数f(x),以便使网络更加弱小,减少它的能力,使它能够学习简单的事物,简单的表单数据,以及示意输入输出之间非线性的简单的任意函数映射。因而,应用非线性激活函数,咱们便可能从输入输出之间生成非线性映射。激活函数的另一个重要特色是:它应该是能够辨别的。咱们须要这样做,以便在网络中向后推动以计算绝对于权重的误差(失落)梯度时执行反向优化策略,而后相应地应用梯度降落或任何其余优化技术优化权重以缩小误差。*摘自什么是激活函数?它有什么作用?依据我集体的了解,激活函数位于两层之间,即上一层计算输入后,通过激活函数将output解决成别的状态,再作为input输出到下一层。为什么要用激活函数?如上文所摘,如果没有激活函数,咱们所失去的最终后果y,不过是输出x的线性组合而已。不过单纯线性激活函数适宜于回归模型,即输入后果不是0、1分类而是一个实数,例如对价格的预测。目前罕用的激活函数除了Chapter2中提到的sigmoid函数外,还有tanh、ReLU。Tanh函数能够看作sigmoid函数的变形:先平移,再拉伸。目标是将平均值从0.5调整到0,次要应用在暗藏层中。如上图所示,无论是tanh还是sigmoid函数,在达到肯定值后,函数的斜率会靠近于0,这会升高梯度降落算法的效率;因而引入了ReLU函数。 第三章拖得太久了,之前很多细节都遗记了……3.9及之后的大节次要是和数学无关,难度也不大,就不放上来了。这几天把反向流传和梯度降落再整一下,开始第四章。

May 4, 2023 · 1 min · jiezi

关于学习笔记:OneFlow学习笔记从OpExprInterpreter到OpKernel

撰文|月踏 更新|赵露阳 前文《OneFlow学习笔记:从Functor到OpExprInterpreter》讲了OpExprInterpreter的相干细节,再往下就是OneFlow中的虚拟机,它负责在eager模式下把指令(即op,在vm中称为指令)调度到具体的OpKernel上来执行。 1 Global简介先看一个非凡的类Global,定义在oneflow/core/common/global.h,这个类很简略,然而对于整个零碎来说很重要,次要的几个接口如下: template<typename T, typename Kind = void>class Global final { public: // 获取创立过的对象 static T* Get() { ... } // 创建对象 static void SetAllocated(T* val) { ... } template<typename... Args> static T* New(Args&&... args) { ... } // 开释对象 static void Delete() { ... } ...};这是一个能够依据指定程序来创立全局单例对象的类,次要用在零碎的初始化中,这样对于一些全局的对象在初始化的时候创立好,后续整个零碎的各个模块就都能够应用了。 2 零碎初始化过程再持续看零碎的初始化流程,首先在python/oneflow/__init__.py+217中能够找到上面这句话: __oneflow_global_unique_env = env_util.GetEnv()GetEnv()办法在python/oneflow/framework/env_util.py中定义,其返回一个EnvHolder的Python对象,此对象初始化时,通过self._env_cxt = create_env()创立了OneFlow运行时所须要的环境上下文: class EnvHolder(object): def __init__(self): if not HasAllMultiClientEnvVars(): SetDefaultMultiClientEnvVars() self._env_cxt = create_env() ...def create_env(): """create environment Returns: Env: [description] """ global default_env_proto assert len(default_env_proto.machine) > 0 CompleteEnvProto(default_env_proto) if default_env_proto.ctrl_bootstrap_conf.world_size > 1: check_non_localhost_proxy_and_print_warning() return c_api_util.GetEnvContext(default_env_proto)create_env()中,首先会通过CompleteEnvProto创立默认的env_proto对象,而后依据此env proto对象创立oneflow所须要的环境上下文env_ctx。 ...

April 28, 2022 · 5 min · jiezi

关于学习笔记:每日学习amdahl定律及其意义

什么是amdahl定律当咱们对系统的某个局部进行优化减速时,其对系统整体性能的影响取决于该局部的重要性和减速水平。 若零碎执行某应用程序须要工夫为$a_i$ 假如零碎某局部所需执行工夫与该工夫的比例为a,而该局部性能晋升比例为k。即该局部初始所需工夫为aTold,当初所需工夫为(aTau)/k。因而,总的执行工夫应为 该局部的零碎整体占比和优化晋升水平独特决定了优化成果

February 23, 2022 · 1 min · jiezi

关于学习笔记:Java

开发环境JDK:JAVA 编译环境JRE:JAVA 运行环境根本语法数据类型(四种八类型)整数型:byte, short, int, long;浮点型:float, double;字符型:char;布尔型:boolean.书写标准类名放弃首字母大写,包名放弃小写,办法名应用驼峰写法。 面向对象在 JAVA 中,万事万物都是对象。尽管如此,理论的代码编译中操作的的确对象的援用(reference)。 类也是对象对象援用是绝对于对象独立的存在,也就是说有一个对象利用,然而不须要一个对象与之对应。 Car carKey;以上创立的只是援用,而并非对象。如果想在代码之中应用这个援用时,会返回一个没有对象关联的异样。平安的做法是,在创建对象援用时把一个对象赋给它。此时咱们须要应用new办法。 new一个对象应用new进行对象的创立: Sheep sheep1 = new Sheep();Sheep sheep2 = new Sheep("codesheep", 18, 65.0f);通过new办法,通过调用类的无参或有参结构的办法来实例化了两个对象。 在创建对象的过程中,JVM解决了如下步骤 首先,new一个对象时,以Sheep sheep = new Sheep()为例,JVM会先来查看Sheep这个符号援用的类是否曾经被加载过,如果没有就要执行对应类的加载过程。在这个过程中,对象占用的内存就曾经定下来了。申明类型援用。Sheep sheep = new Sheep()中就申明了一个Sheep类型的援用sheep。依照第一步中布局的内存调配打算,JVM会在堆上给对象分配内存。初始化0值。例int的初始化0值就是0,对象化的初始化0值就是null。接下来JVM会进行对象头的设置,这外面就次要包含对象的运行时数据(比方Hash码、分代年龄、锁状态标记、锁指针、偏差线程ID、偏差工夫戳等)以及类型指针(JVM通过该类型指针来确定该对象是哪个类的实例);属性的显示初始化也好了解,比方定义一个类的时候,针对某个属性字段手动的赋值,如:private String name = "codesheep"; 就在这时候给初始化上;最初是调用类的构造方法来进行进行构造方法内形容的初始化动作。通过以上的步骤一个对象才得以诞生。 属性和办法类的一个最根本的因素就是属性和办法。 属性也被称为字段,是类的重要组成部分。属性能够使任意类型的对象,也能够是最根本的数据类型。 class A{ int a; Apple apple;}类中还应该包含办法,办法示意的是做某些事件的形式。办法其实就是函数,只不过Java习惯把函数成为办法,这种叫法也体现了面向对象的概念。 办法的根本形成包含: 办法名称;参数;返回值;办法体。e.g. public int getResult(){ // ... return 1;}其中getResult就是办法名,()示意承受的参数,return示意办法的返回值,{}中的为办法体。 构造方法在Java中,有一种非凡的办法被称为构造方法(或构造函数、结构器)。在Java中,通过提供这个结构器,来确保每个对象都被初始化。构造方法只能在对象创立期间调用一次,保障了对象初始化的进行。构造方法比拟非凡,它没有参数类型和返回值,它的名称要和类名称保持一致,并且构造方法能够有多个。 e.g. //一堆初始化办法的初始化类class Apple{ int sum; String color; public Apple(){} public Apple(int sum){} public Apple(String color){} public Apple(int sum, String color){}}//开始class createApple{ public static void main(String[] args){ Apple apple1 = new Apple(); Apple apple2 = new Apple(1); Apple apple3 = new Apple("red"); Apple apple4 = new Apple(2,"color"); }}以上,在Apple类中,定义了四个构造方法。其中,不加任何参数的构造方法被称为默认的构造方法,即: ...

December 22, 2021 · 8 min · jiezi

关于学习笔记:阿里p8私藏MyBatis笔记从入门到精通纵享源码细节

前言越来越多的企业曾经将MyBatis应用到了正式的生产环境,我认为风行的起因就在于绝大部分我的项目都是面向表构造编程的,把Java对象仅当成数据容器,查问和模型变更都设计在一张表上,所谓业务逻辑就是一堆增删改查的sql汇合,因而Mybatis用起来十分不便。 为什么要学MyBatis?除了我下面说的目前MyBatis在国内十分风行外,还有以下几点: ①学好MyBatis能很好地帮忙咱们解决数据层开发的问题; ②MyBatis源码中有很多设计模式和并发编程的技巧,学好源码对晋升编码能力有很大的帮忙; ③最初,Mybatis源码也是大厂面试的常常问的点。 基于上述情况,本次将给大家分享阿里p8私藏MyBatis笔记,帮忙大家由浅入深地学习MyBatis相干常识,纵享源码细节,让开发者不仅知其然,更知其所以然。 注:因为内容较多,本次将展现局部,如果看得不过瘾想更加深刻地理解本笔记彻底把握 本文分为两局部,然而我想反套路来一波,首先给大家展现一下源码,再展现MyBatis整体学习内容,不多bb,间接上了。![上传中...]()阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节A:精进MyBatis源码剖析 - 整体架构①整体架构 我的项目构造整体架构根底反对层外围解决层接口层 阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节B:精进MyBatis源码剖析 - 根底反对层①根底反对层 解析器模块反射模块异样模块数据源模块事务模块缓存模块类型模块IO模块日志模块注解模块Binding模块 阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节C:精进MyBatis源码剖析 - MyBatis初始化(一)之加载 mybatis-config.xml①MyBatis的初始化 ②初始化(一)之加载mybatis-config.xml SqlSessionFactoryBuilderXMLConfigBuilderConfiguration阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节D:精进MyBatis源码剖析 - MyBatis初始化(二)之加载 Mapper 接口与 XML 映射文件①MyBatis的初始化 ②初始化(二)之加载Mapper接口与映射文件 解析入口MapperAnnotationBuilderXMLMapperBuilderXMLStatementBuilderMapperBuilderAssistantRequestMappingResultMapMappedStatement阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节E:精进MyBatis源码剖析 - MyBatis初始化(三)之 SQL 初始化(上)①MyBatis的初始化 ②初始化(三)之SQL初始化(上) LanguageDriverXMLScriptBuilderNodeHandlerDynamicContextSqlNodeOgnlCache阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节F:精进MyBatis源码剖析 - MyBatis初始化(四)之 SQL 初始化(下)①MyBatis的初始化 ②初始化(四)之SQL初始化(下) SqlSourceBuilderParameterExpressionParameterMappingSqlSourceBoundSqlDefaultParameterHandler阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节G:精尽MyBatis源码剖析 - SQL执行过程(一)之 Executor①MyBatis的SQL执行过程 ②SQL执行过程(一)之Executor ExecutorBaseExecutorSimpleExecutorReuseExecutorBatchExecutor二级缓存Executor在哪被创立阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节H:精尽MyBatis源码剖析 - SQL执行过程(二)之 StatementHandler①MyBatis的SQL执行过程 ②SQL执行过程(二)之StatementHandler StatementHandlerRoutingStatementHandlerBaseStatementHandlerSimpleStatementHandlerPreparedStatementHandlerCallableStatementHandlerKeyGeneratorJdbc3KeyGeneratorSelectKeyGeneratorNoKeyGenerator阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节I:精尽MyBatis源码剖析 - SQL执行过程(三)之 ResultSetHandler①MyBatis的SQL执行过程 ②SQL执行过程(三)之ResultSetHandler ResultSetWrapperResultSetHandlerDefaultResultSetHandler阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节J:精尽MyBatis源码剖析 - SQL执行过程(四)之提早加载①MyBatis的SQL执行过程 ②SQL执行过程(四)之提早加载 ResultLoaderResultExtractorResultLoaderMapProxyFactoryJavassistProxyFactoryCglibProxyFactory阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节K:精尽MyBatis源码剖析 - SqlSession 会话与 SQL 执行入口①SqlSession会话与SQL执行入口 SqlSessionFactoryBuilderDefaultSqlSessionFactoryDefaultSqlSessionMapperMethod阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节O:精尽MyBatis源码剖析 - 插件机制①插件机制 植入插件逻辑分页插件示例InterceptorInvocationPluginInterceptorChain阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节P:精尽MyBatis源码剖析 - MyBatis-Spring 源码剖析①配置示例 ...

July 17, 2021 · 1 min · jiezi

关于学习笔记:CRC16学习笔记

参考文章: http://www.360doc.com/content...http://www.xjtudll.cn/Exp/273/http://www.ip33.com/crc.htmlhttps://blog.csdn.net/liyuanb...最近在学习Modbus协定,看到CRC校验后被难住,而后在网上找了一下材料,整顿如下,不便查阅。 什么是CRCCRC即循环冗余校验码(Cyclic Redundancy Check):是一种数据传输检错性能,对数据进行多项式计算,并将失去的后果附在帧的前面,接管设施也执行相似的算法,以保障数据传输的正确性和完整性。 CRC算法CRC算法的根本思维是将传输的数据当做一个位数很长的数。将这个数除以另一个数。失去的余数作为校验数据附加到原数据前面。 在CRC算法中,这个被除数有一个专有名称叫做“生成多项式”。生成多项式的选取是个很有难度的问题,如果选的不好,那么检出谬误的概率就会低很多。好在这个问题曾经被专家们钻研了很长一段时间了,对于咱们这些使用者来说,只有把现成的成绩拿来用就行了。 最罕用的几种生成多项式如下: CRC8=X8+X5+X4+X0CRC-CCITT=X16+X12+X5+X0CRC16=X16+X15+X2+X0CRC12=X12+X11+X3+X2+X0CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0CRC算法的编程实现假如咱们的生成多项式为:100110001(简记为0x31),也就是CRC-8 则计算步骤如下: 1、将CRC寄存器(8-bits,比生成多项式少1bit)赋初值02、在待传输信息流前面退出8个03、While (数据未解决完)4、Begin5、 If (CRC寄存器首位是1)6、 reg = reg XOR 0x317、 CRC寄存器左移一位,读入一个新的数据于CRC寄存器的0 bit的地位。8、End9、CRC寄存器就是咱们所要求的余数。实际上,真正的CRC 计算通常与下面形容的还有些出入。这是因为这种最根本的CRC除法有个很显著的缺点,就是数据流的结尾增加一些0并不影响最初校验字的后果。这个问题很让人恼火啊,因而真正利用的CRC 算法根本都在原始的CRC算法的根底上做了些小的改变。 所谓的改变,也就是减少了两个概念,第一个是“余数初始值”,第二个是“后果异或值”。 所谓的“余数初始值”就是在计算CRC值的开始,给CRC寄存器一个初始值。“后果异或值”是在其余计算实现后将CRC寄存器的值在与这个值进行一下异或操作作为最初的校验值。退出这些变形后,常见的算法形容模式就成了这个样子了: 1、设置CRC寄存器,并给其赋值为“余数初始值”。2、将数据的第一个8-bit字符与CRC寄存器进行异或,并把后果存入CRC寄存器。3、CRC寄存器向右移一位,MSB补零,移出并查看LSB。4、如果LSB为0,反复第三步;若LSB为1,CRC寄存器与0x31相异或。5、反复第3与第4步直到8次移位全副实现。此时一个8-bit数据处理结束。6、反复第2至第5步直到所有数据全副解决实现。7、最终CRC寄存器的内容与“后果异或值”进行或非操作后即为CRC值。CRC16/MODBUS计算方法1、设置CRC寄存器,并给其赋值0xFFFF。2、将数据的第一个8-bit字符与CRC寄存器进行异或,并把后果存入CRC寄存器。3、CRC寄存器向右移一位,MSB补零,移出并查看LSB。4、如果LSB为0,反复第三步;若LSB为1,CRC寄存器与0x31相异或,后果存入CRC寄存器。5、反复第3步与第4步直到8次移位全副实现。此时一个8-bit数据处理结束。6、反复第2至第5步直到所有数据全副解决实现。7、最终CRC寄存器的内容即为CRC值。以下应用C#代码实现上述计算方法 private void CalculateCRC(byte[] pByte, int nNumberOfBytes, out ushort pCheckSum){ int nBit; pCheckSum = 0xFFFF; for (int nByte = 0; nByte < nNumberOfBytes; nByte++) { pCheckSum ^= pByte[nByte]; for(nBit = 0;nBit < 8;nBit++) { if((pCheckSum & 0x1) == 1) { pCheckSum = (pCheckSum >> 1) ^ 0xA001; } else { pCheckSum >>= 1; } } }}理论应用中,上述代码因为效率过低很少被应用。罕用查表法代替。 ...

May 29, 2021 · 6 min · jiezi