C#,数值计算——循环冗余校验和(CRC,Cyclic Redundancy Checksum)的计算方法与源代码

news2024/11/16 23:56:27

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// 循环冗余校验和
    /// cyclic redundancy checksum
    /// </summary>
    public class Icrc
    {
        private uint jcrc { get; set; }
        private uint jfill { get; set; }
        private uint poly { get; set; }
        private static uint[] icrctb { get; set; } = new uint[256];

        public Icrc(int jpoly, bool fill = true)
        {
            this.jfill = (uint)(fill ? 255 : 0);
            uint[] okpolys = { 
                0x755B, 0xA7D3, 0x8005, 0x1021, 
                0x5935, 0x90D9, 0x5B93, 0x2D17 
            };
            poly = okpolys[jpoly & 7];
            for (int j = 0; j < 256; j++)
            {
                icrctb[j] = icrc1((uint)(j << 8), 0);
            }
            jcrc = (jfill | (jfill << 8));
        }

        public uint crc(string bufptr)
        {
            jcrc = (jfill | (jfill << 8));
            return concat(bufptr);
        }

        public uint concat(string bufptr)
        {
            uint cword = jcrc;
            uint len = (uint)bufptr.Length;
            for (int j = 0; j < len; j++)
            {
                cword = (uint)(icrctb[(byte)bufptr[j] ^ hibyte((ushort)cword)] ^ (lobyte((ushort)cword) << 8));
            }
            return jcrc = cword;
        }

        public uint icrc1(uint jcrc, byte onech)
        {
            uint ans = (uint)(jcrc ^ onech << 8);
            for (int i = 0; i < 8; i++)
            {
                if ((ans & 0x8000) != 0)
                {
                    ans = (uint)((ans <<= 1) ^ poly);
                }
                else
                {
                    ans <<= 1;
                }
                ans &= 0xffff;
            }
            return ans;
        }

        public byte lobyte(ushort x)
        {
            return (byte)(x & 0xff);
        }

        public byte hibyte(ushort x)
        {
            return (byte)((x >> 8) & 0xff);
        }

        public static bool decchk(string str, ref char ch)
        {
            int[,] decchk_ip =
            {
                {0, 1, 5, 8, 9, 4, 2, 7},
                {1, 5, 8, 9, 4, 2, 7, 0},
                {2, 7, 0, 1, 5, 8, 9, 4},
                {3, 6, 3, 6, 3, 6, 3, 6},
                {4, 2, 7, 0, 1, 5, 8, 9},
                {5, 8, 9, 4, 2, 7, 0, 1},
                {6, 3, 6, 3, 6, 3, 6, 3},
                {7, 0, 1, 5, 8, 9, 4, 2},
                {8, 9, 4, 2, 7, 0, 1, 5},
                {9, 4, 2, 7, 0, 1, 5, 8}
            };
            int[,] decchk_ij =
            {
                {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 0, 6, 7, 8, 9, 5},
                {2, 3, 4, 0, 1, 7, 8, 9, 5, 6},
                {3, 4, 0, 1, 2, 8, 9, 5, 6, 7},
                {4, 0, 1, 2, 3, 9, 5, 6, 7, 8},
                {5, 9, 8, 7, 6, 0, 4, 3, 2, 1},
                {6, 5, 9, 8, 7, 1, 0, 4, 3, 2},
                {7, 6, 5, 9, 8, 2, 1, 0, 4, 3},
                {8, 7, 6, 5, 9, 3, 2, 1, 0, 4},
                {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
            };
            int k = 0;
            int m = 0;
            int n = str.Length;

            int j;
            for (j = 0; j < n; j++)
            {
                char c = str[j];
                if (c >= 48 && c <= 57)
                {
                    k = decchk_ij[k, decchk_ip[(c + 2) % 10, 7 & m++]];
                }
            }
            for (j = 0; j < 10; j++)
            {
                if (decchk_ij[k, decchk_ip[j, m & 7]] == 0)
                {
                    break;
                }
            }
            ch = (char)(j + 48);
            return k == 0;
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ISO26262】汽车功能安全第3部分:概念阶段

GB/T34590《道路车辆 功能安全》分为以下部分: 需要文档的朋友,可以和我联系! tommi_wei@163.com GB/T34590的本部分规定了车辆在概念阶段的要求: ———相关项定义; ———安全生命周期启动; ———危害分析和风险评估;及 ———功能安全概念。 危害事件分类 对于每一个…

多网口UDP发包无法收到回包排查与解决

最近几周几乎都是单休&#xff0c;加班很多&#xff0c;也遇到了很多未知的问题&#xff0c;杂事也多时间比较紧张&#xff0c;也没有多少空余来进行一些总结积累。这点让我很是怀念起几年前的日子&#xff0c;任务安排周期长&#xff0c;做技术纯粹又专心。 前几天遇到了一个…

chatgpt赋能python:如何将Python导入PyCharm

如何将Python导入PyCharm 介绍 PyCharm是一个非常流行的Python开发工具&#xff0c;它拥有许多强大的功能和插件&#xff0c;使开发人员能够更高效地编写Python代码。在本篇文章中&#xff0c;我们将介绍如何将Python导入PyCharm。 步骤 1. 安装PyCharm 首先&#xff0c;您…

jupyter-notebook:从记录点回复数据

使用jupyter进行记录数据分析思路时&#xff0c;有时候会莫名出现一些问题。比如这次遇到的保存并关闭之后&#xff0c;隔了一个晚上再次打开文件就成了空文件了&#xff0c;昨天写的分析都没有了&#xff0c;很头疼。解决方法&#xff1a;如果确定是保存了后&#xff0c;每一个…

32 linux 中物理页的 cow

前言 熟悉 linux 进程机制的人都知道 linux 中新建进程是以 fork exec 的形式创建的进程 fork 的时候复制了父进程的相关数据结构, 然后更新了待执行的 binary, 去执行 然后 父子进程之间 内存管理是 基于 copy on write 的 对于某块物理页, fork 之后内存设置为 只读…

JAVA3

文章目录 注释核心机制JVM的功能 优缺点优点缺点 注释 例子&#xff1a; 核心机制 JVM的功能 优缺点 优点 缺点

FreeRTOS入门(二)

目录 什么是RTOS? 嵌入式有哪些常见的RTOS&#xff1f; ✓ VxWorks&#xff08;开源收费&#xff09; ✓ UCOSII&III&#xff08;开源免费&#xff09; ✓ FreeRTOS&#xff08;开源免费&#xff09; ✓ RT_Thread(开源免费) ✓ AliOS(开源收费) ✓ LiteOS FreeR…

微信小程序canvas层级太高,与其他非原生组件层级冲突

官网已经提出新版本以支持同层渲染&#xff0c;但是实际项目中层级还是冲突的。 最后在文档中找到这样一段话&#xff0c;用真机打开&#xff0c;层级就正常了 。所以建议大家&#xff0c;多使用真机调试去测试&#xff01;&#xff01;&#xff01;&#xff01;

redis中常用的命令

1.关于对key操作的命令 keys *: 查看redis中所有的key exists key: 判断指定的key是否存在。存在返回1 否则返回0 del key: 删除指定的key expire key seconds: 为指定的key设置过期时间 2.关于库的命令 默认redis中存在16个库 select n: 选中库 n0~15 flushdb: 清空…

C++中的exec()函数

exec()函数在C中是一个进程控制函数&#xff0c;用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据&#xff0c;创建新的进程运行其他程序。exec()函数有多个版本&#xff0c;例如execl、execv、execle、execve等&#xff0c;根据不同的参数类型…

SAP 区分工单BOM物料是手工删除 还是 Teco后自动关闭需求

SAP 区分工单BOM物料是手工删除 还是 Teco后自动关闭需求 首先 resb表删除标识XLOEK 都为 ‘X’&#xff0c;无法通过其它字段直接区分 1先从前台界面区分 手工删除的&#xff0c;组件界面颜色正常&#xff0c;状态为-REL 删除 Teco自动关闭需求的&#xff0c;颜色不一样&am…

python中调用java函数

python中调用java函数 1. 将java项目打包成jar&#xff08;IDEA&#xff09;2. 在python中调用jar 1. 将java项目打包成jar&#xff08;IDEA&#xff09; 【CtrlShiftAltS】或者“File --> Project Structure --> Project Settings” 选择Artifacts选项卡&#xff0c;点…

[Android Studio]1.2计数器

所有要改的代码如下&#xff1a; MainActivity代码&#xff1a; package com.example.code02;import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; imp…

FPGA第一个程序入门

1、使用正点原子的达芬奇开发板进行第一个FPGA程序设计。 2、启动vivado 2019.2。 3、 新建工程。 File--Project--New&#xff0c;选择RTL Project&#xff08;寄存器传输级&#xff09;。 4、选择器件。 add sources点击next&#xff0c; add constraints点击next&#x…

npm install安装依赖总结

node下载地址&#xff1a;https://nodejs.org/en/download/releases 。可以看到node版本、npm版本、node_module版本 1.npm的全局安装路径 查看默认值&#xff1a; npm get prefix 默认是C:\Users\你的用户名\AppData\Roaming\npm 、 可以通过 npm config prefix 更改全局…

mysql-数据迁移 及报错解决(ERROR 1290 (HY000)

文章目录 1. 物理迁移1. 迁移前&#xff0c;配置mysql的输出目录1. 查看mysql的输出目录2. 修改mysql的输出目录 2. 文件迁移 1. 物理迁移 1. 迁移前&#xff0c;配置mysql的输出目录 1. 查看mysql的输出目录 在安装MySQL的会限制了导入与导出的目录权限。只允许在规定的目录…

量子 能源,节能减排还是另有“端倪”?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;解读量子技术将为下游应…

基于matlab从3D医学图像中对脑肿瘤进行语义分割(附源码)

一、前言 此示例演示如何从 3D 医学图像中对脑肿瘤进行语义分割。 语义分割涉及用类标记 3-D 体积的图像或体素中的每个像素。此示例说明了如何使用 3-D U-Net 深度学习网络在磁共振成像 &#xff08;MRI&#xff09; 扫描中对脑肿瘤进行二进制语义分割。U-Net是一个快速&…

【MySQL学习笔记】(五) 表的约束

表的约束 1 什么是约束&#xff1f;2 空属性3 默认值4 列描述5 zerofill6 主键7 自增长8 唯一键9 外键 1 什么是约束&#xff1f; 约束是一种限制&#xff0c;它通过对表的行或列的数据做出限制&#xff0c;来确保数据的完整性、一致性。 真正约束字段的是数据类型&#xff0…

Electron快速入门

目录 前言 一、安装需知 二、安装electron 三、开始 3.1 修改package.json文件 3.2 创建main.js文件 3.3 启动预览窗口 3.4 显示内容 四、 热加载 五、主进程和渲染进程概念介绍 六、自定义原生菜单 6.1 自定义菜单 6.2 给菜单添加点击事件 6.3 抽离菜单定义 6.…