NET和JAVA实现MOD37 36校验码计算

合集下载

java crc3216进制数校验算法

java crc3216进制数校验算法

java crc3216进制数校验算法Java CRC32是一种校验算法,用于对数据进行校验和验证。

CRC32是循环冗余校验码的32位实现,它通过对数据进行多项式除法运算来生成一个32位的校验值。

本文将详细介绍Java CRC32算法的原理、应用及其实现方式。

一、CRC32校验算法原理CRC32算法是一种循环冗余校验码算法的32位实现。

它通过对数据进行多项式除法运算,得到一个32位的校验值。

具体的原理如下:1. 初始化CRC寄存器的值为全1(32个1)。

2. 将要校验的数据的每个字节与CRC寄存器的值进行异或运算。

3. 将CRC寄存器的值右移8位,并用一个预设的多项式(通常是0xEDB88320)进行异或运算。

4. 重复步骤2和3,直到所有的数据字节都被处理过。

5. 最终得到的CRC寄存器的值即为校验值。

二、CRC32校验算法应用CRC32校验算法在数据传输和存储中广泛应用,其中一些常见的应用包括:1. 数据完整性校验:通过计算数据的CRC32校验值,可以验证数据在传输或存储过程中是否发生了错误或损坏。

2. 文件校验:在下载文件或拷贝文件时,可以通过比较源文件和目标文件的CRC32校验值来判断文件是否完整无误。

3. 网络通信:在网络通信中,通过计算发送数据的CRC32校验值,接收方可以验证接收到的数据的完整性。

4. 数据库校验:在数据库中存储数据的同时,可以计算数据的CRC32校验值,并将其与存储的数据一起存储。

当需要读取数据时,可以通过比较计算得到的CRC32校验值和存储的校验值来验证数据的完整性。

三、Java CRC32算法实现Java提供了java.util.zip.CRC32类来实现CRC32校验算法。

下面是一个使用Java CRC32算法计算校验值的示例代码:```javaimport java.util.zip.CRC32;public class CRC32Example {public static void main(String[] args) {byte[] data = "Hello, CRC32!".getBytes();CRC32 crc32 = new CRC32();crc32.update(data);long checksum = crc32.getValue();System.out.println("CRC32 checksum: " + checksum);}}```在上述示例代码中,首先将要校验的数据转换为字节数组。

校验码的计算

校验码的计算

校验码的计算
1、试用几何级数法确定原代码为1684的校验位和新代码。

要求以11为模,以27、9、3、1为权。

解:原代码 1 6 8 4
各乘以权 27 9 3 1
乘积之和 27+54+24+4=109
以11为模除乘积之和109/11=9 (10)
因余数是10,所以校验位按0处理
故校验位为0,新代码为16840
2、用质数法设计代码校验位:原代码共7位,从左到右取权3,5,7,13,17,19,23,以11为模,试求出2690088的校验位?如果让“11”既作模,又作权,会存在什么缺陷(可以举例说明)?解:校验位的计算:
原码: 2 6 9 0 0 8 8
权: 3 5 7 13 17 19 23
乘积: 6 30 63 0 0 152 18
4
435
乘积之
和:
模11结果435/11=39 (6)
校验位: 6
新码:26900886
(2)如果“11”既作模,又作权,那么当该位发生错误时,校验位将无法检测到这位发生错误。

如:不妨将权13改为11(左边第四位权),原代码是2690088,其校验位仍为6,新码是26900886;在输入或传输过程中发生错误:第四位由0变为9(或其它任意数字1-9),即输入“26990886”此时的校检位6将无法检测到已发生的错误!因为2X3+6X5+9X7+9X11+0X17+8X19+8X23=435+9X11=534模11后所得余数仍为6,计算机会认为:“26900886”输成“26990886”没有发生错误!。

校验码算法

校验码算法

校验码算法是一种用于验证数据传输是否正确的技术,通常用于网络通信和数据存储。

以下是校验码算法的主要步骤和示例:
1. 生成原始数据:首先,需要生成需要校验的原始数据,可以是任何类型的数据,如文本、图像、音频等。

2. 选择校验算法:根据需要和实际情况选择适当的校验算法,如奇偶校验(parity check)、海明校验(Hamming code)、循环冗余校验(CRC)等。

3. 添加校验位:根据选择的校验算法,将校验位添加到原始数据中。

校验位是额外添加的位,用于表示原始数据中的某些位,以便在接收端进行错误检测和纠正。

4. 发送数据和校验位:将原始数据和校验位一起发送到接收端。

5. 接收数据和校验位:接收端接收到数据和校验位后,使用相同的校验算法对数据进行校验。

6. 检测错误:根据校验算法的规则,检测是否存在错误。

如果存在错误,可以根据算法的规则进行纠正。

7. 返回结果:如果没有检测到错误,则返回“校验通过”,否则返回“校验不通过”。

下面是一个简单的例子,使用奇偶校验算法对一个字节进行错误检测和纠正:
1. 原始数据:01100101(8个位)
2. 选择奇偶校验算法:将每个位的值加起来,使得结果为偶数。

如果结果为奇数,则将最高位设为1。

3. 添加校验位:因为原始数据的二进制表示中有四个1,所以需要添加一个校验位,使得所有位的值为奇数或偶数。

因此,将最高位设为1,得到新的数据:10100101。

4. 发送数据和校验位:将新的数据(包括校验位)发送到接收端。

5. 接收数据和校验位:接收端接收到数据后。

奇偶校验码的计算方法讲解

奇偶校验码的计算方法讲解

奇偶校验码的计算方法讲解
奇偶校验码是一种增加二进制代码传输距离的最简单
和最广泛的方法,通过增加冗余位使码字中“1”的个数恒
为奇数或者偶数。

奇偶校验码有两种,奇校验和偶校验,其计算方法如下:
1.奇校验:
先计算信息位中的“1”的个数。

如果“1”的个数是奇数,那么校验位为0。

如果“1”的个数是偶数,那么校验位为1。

最终得到的码字中“1”的个数为奇数。

2.偶校验:
先计算信息位中的“1”的个数。

如果“1”的个数是奇数,那么校验位为1。

如果“1”的个数是偶数,那么校验位为0。

最终得到的码字中“1”的个数为偶数。

在计算过程中,需要注意二进制位和校验位的异或操作,以确保最终得到的码字满足奇校验或偶校验的要求。

以上信息仅供参考,建议咨询专业技术人员获取更准确的信息。

crc算法java实现

crc算法java实现

crc算法java实现开头部分:CRC(Cyclic Redundancy Check)算法是一种常用的错误检测算法,用于检测数据传输过程中的错误。

它可以对发送的数据进行编码,并在接收端对接收到的数据进行解码。

CRC算法的核心思想是通过添加校验位来检测数据传输过程中的错误。

本文将介绍CRC算法的原理及其在Java中的实现。

一、CRC算法原理CRC算法的核心思想是在数据的尾部添加一组校验位,也称为CRC 码。

发送端利用原始数据和CRC生成多项式进行编码,接收端利用接收到的数据和CRC生成多项式进行解码。

如果接收到数据的CRC码与接收端生成的CRC码一致,则说明数据传输无错误;否则,数据传输过程中发生了错误。

CRC算法的实现基于多项式除法运算。

具体实现过程如下:1.发送端:(1)设定一个生成多项式G(x),长度为n+1。

多项式的系数为0或1,其中n是CRC码的长度。

(2)将原始数据进行左移n位,并在低位补零。

(3)将补零后的数据与G(x)进行模2除法运算,得到余数R(x)。

(4)将原始数据和余数R(x)拼接在一起,形成发送的数据帧。

2.接收端:(1)接收到数据帧后,将接收到的数据进行左移n位,并在低位补零。

(2)将补零后的数据与G(x)进行模2除法运算,得到余数R(x)。

(3)如果余数R(x)为0,则说明数据传输无错误;否则,说明数据传输过程中发生了错误。

二、CRC算法的Java实现以下是CRC算法在Java中的实现代码,具体实现过程为:1. CRC编码函数:```javapublic static String crcEncode(String data, String crc) { int n = crc.length() - 1; // CRC码长度int[] dataBits = new int[data.length() + n]; //补零后的数据位int[] remainder = new int[n]; //余数R(x)//将原始数据转换为整型数组for (int i = 0; i < data.length(); i++) {dataBits[i] =Integer.parseInt(String.valueOf(data.charAt(i)));}//左移n位,并在低位补零for (int i = data.length(); i < data.length() + n; i++) { dataBits[i] = 0;}//模2除法运算for (int i = 0; i < dataBits.length - n; i++) {if (dataBits[i] != 0) {for (int j = 0; j < n; j++) {dataBits[i + j] = dataBits[i + j] ^Integer.parseInt(String.valueOf(crc.charAt(j)));}}}//获取余数R(x)System.arraycopy(dataBits, dataBits.length - n, remainder, 0, n);//拼接原始数据和余数R(x)作为发送的数据帧StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(data);for (int i : remainder) {stringBuilder.append(i);}return stringBuilder.toString();}```2. CRC解码函数:```javapublic static boolean crcDecode(String data, String crc) {int n = crc.length() - 1; // CRC码长度int[] dataBits = new int[data.length()]; //接收到的数据位int[] remainder = new int[n]; //余数R(x)//将接收到的数据转换为整型数组for (int i = 0; i < data.length(); i++) {dataBits[i] =Integer.parseInt(String.valueOf(data.charAt(i)));}//左移n位,并在低位补零for (int i = 0; i < n; i++) {dataBits[i] = 0;}//模2除法运算for (int i = 0; i < dataBits.length - n; i++) { if (dataBits[i] != 0) {for (int j = 0; j < n; j++) {dataBits[i + j] = dataBits[i + j] ^Integer.parseInt(String.valueOf(crc.charAt(j)));}}}//获取余数R(x)System.arraycopy(dataBits, dataBits.length - n, remainder, 0, n);//判断接收到的数据帧是否正确for (int i : remainder) {if (i != 0) {return false;}}return true;}```以上代码实现了CRC算法的编码和解码过程。

uid校验位计算方法

uid校验位计算方法

uid校验位计算方法在当今的数字时代,数据的安全性和准确性变得越来越重要。

UID(用户身份识别码)作为识别用户身份的一种方式,在很多系统中扮演着关键角色。

为了保证UID的可靠性,通常会引入校验位来验证其有效性。

本文将详细介绍UID校验位的计算方法。

UID校验位计算方法是用来确保UID在传输或存储过程中保持正确无误的一种技术手段。

下面,我们将以常见的几种校验位计算方法为例,进行详细讲解。

### 1.Mod 11 校验法这是一种广泛使用的校验方法,特别是在各类身份证号码中。

其基本步骤如下:1.将UID的每一位数字乘以一个权重因子(这个权重因子可以是固定的,也可以是按照一定规则变化的)。

2.将所有乘积相加,得到一个总和。

3.用这个总和除以11,得到的余数即为校验位。

### 2.CRC 校验循环冗余校验(CRC)是一种用于检测数据传输或存储中错误的方法,步骤如下:1.补充UID:在UID的末尾添加一定数量的“0”位,使其长度满足CRC 计算的要求。

2.使用预定义的多项式进行模2除法运算。

3.计算得到的余数即为校验位。

### 3.Luhn 校验算法这种算法常用于信用卡号的校验,计算方法如下:1.从UID的右边开始,每隔一位乘以2。

2.如果乘积大于9,则将乘积减去9。

3.将所有乘积(包括未被乘以2的数字)相加。

4.用这个总和乘以9,然后取个位数作为校验位。

### 4.海明码海明码是一种可以检测和纠正错误的校验方法,适用于较为复杂的UID校验:1.根据UID的长度和所需纠错能力,确定校验位的数量和位置。

2.利用数学公式计算每个校验位的值,以确保整个UID可以检测或纠正一个或多个错误。

### 结束语不同的系统和应用场景可能需要使用不同的UID校验位计算方法。

选择合适的校验方法,可以大大提高数据的安全性和准确性。

在实际应用中,还需结合具体的业务需求和技术条件,来设计最合适的UID校验机制。

校验位的计算方法

校验位的计算方法

校验位的计算方法
以下是 7 条关于校验位的计算方法:
1. 嘿,你知道吗?校验位可以通过简单的相加来算哟!比如说身份证号的最后一位,就是一种校验位呀。

就像搭积木一样,把数字们加起来,看看结果对不对,来检测有没有错误呢!这多有趣呀!
2. 哇塞,取模运算也可以用来算校验位呢!就好像分糖果一样,按照一定的规则来确定余数,这个余数就是校验位。

比如在一些编码中,通过取模运算来确定校验位,是不是很神奇?
3. 嘿呀,奇偶校验位也好算呀!如果数字是奇数个 1,那就是奇校验;反之就是偶校验。

这就好像判断是晴天还是雨天一样容易呢!像网络传输中经常用到奇偶校验位呀,你想不想知道它是怎么发挥作用的?
4. 哈哈,CRC 校验的计算方法也不难理解呢!它就像给信息做了一个特别的标记,通过一系列复杂的计算来确定。

比如在数据存储和传输中,用它来保证数据的准确性呢,真的超厉害的!
5. 咦,还有一种基于算法的校验位计算方法呢。

就跟解谜题似的,按照特定的步骤和公式来求解。

像有些软件的验证码就是这么来计算的,是不是让你感觉很新奇呀?
6. 哇哦,哈希值也能当校验位哟!它就像是给数据生成的独特指纹一样。

好像在数字世界里给每个东西都贴上了属于它自己的标签,然后通过哈希值来验证呢,这不是很奇妙吗?
7. 嘿,直接对比前后数据也可以当作一种校验方法呢!就像是照着镜子看自己,前后是不是一样。

比如在文件传输前后进行对比,看看有没有变化,这也是很实用的校验位计算方式呀!
我的观点结论就是:校验位的计算方法多种多样,每一种都有其独特的魅力和作用,在各种领域中都发挥着重要的保障信息准确性的功能呢!。

CRC校验码的计算方法

CRC校验码的计算方法

CRC校验码的计算方法CRC(循环冗余校验)是一种常用的数据传输错误检测方法,它可以对数据进行校验,并判断数据是否传输出现错误。

CRC校验码的计算方法相对简单,主要分为以下几个步骤:1. 确定生成多项式(Generator Polynomial)CRC校验的关键在于选择一个正确的生成多项式,它是一个二进制数,通常用一个多项式表示。

生成多项式的位数决定了校验码的长度,常见的有8位、16位、32位等,常用的生成多项式有CRC-8、CRC-16、CRC-32等。

2.初始化CRC寄存器CRC寄存器是CRC计算的核心,初始值可以是全0或全1,具体取决于实际应用场景和采用的CRC标准。

计算过程中,CRC寄存器会根据输入数据进行移位和异或操作。

3.数据填充需要对待校验的数据进行填充,通常在数据最后添加若干个0,填充的位数由CRC校验码的长度决定。

4.CRC计算将待校验的数据和填充的0按位进行异或操作,结果再与生成多项式进行除法操作。

具体操作如下:-将CRC寄存器置为初始值-从最高位开始,依次将待校验数据的每一位与CRC寄存器的最高位进行异或操作-CRC寄存器进行移位操作(除了最高位,其余位向右移动一位)-如果异或操作的结果为1,则用生成多项式进行异或操作,即将CRC寄存器的最低位与生成多项式的对应位进行异或-重复上述步骤,直到待校验数据的每一位都处理完毕5.CRC校验码当待校验的数据处理完毕后,剩下的CRC寄存器的值就是CRC校验码。

校验码的长度与生成多项式的位数相同,通常将校验码附加在待传输的数据后面。

下面以一个简单的例子来说明CRC校验码的计算过程:3.依次进行异或操作和移位操作:通过计算CRC校验码,我们可以在数据传输过程中进行校验,判断数据是否出现错误。

接收方同样按照相同的生成多项式和校验码计算方法,对接收到的数据进行校验,然后比对计算得到的校验码和接收到的校验码是否一致,以此判断数据传输是否正常。

如果一致,则数据传输无误;如果不一致,则数据传输存在错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按照 MOD3736规则计算校验码:
.NET版本:
/// <summary>
/// 计算标识校验码
/// </summary>
/// <param name="ValueCode">标识码前段</param>
/// <returns></returns>
private static string GetCertificateSourceIdCode(string ValueCode) {
string Code = ValueCode.Replace("." string.Empty).ToUpper(); Dictionary<string int> dict = new Dictionary<string int>();
dict.Add("0" 0);
dict.Add("1" 1);
dict.Add("2" 2);
dict.Add("3" 3);
dict.Add("4" 4);
dict.Add("5" 5);
dict.Add("6" 6);
dict.Add("7" 7);
dict.Add("8" 8);
dict.Add("9" 9);
dict.Add("A" 10);
dict.Add("B" 11);
dict.Add("C" 12);
dict.Add("D" 13);
dict.Add("E" 14);
dict.Add("F" 15);
dict.Add("G" 16);
dict.Add("H" 17);
dict.Add("I" 18);
dict.Add("J" 19);
dict.Add("K" 20);
dict.Add("L" 21);
dict.Add("M" 22);
dict.Add("N" 23);
dict.Add("O" 24);
dict.Add("P" 25);
dict.Add("Q" 26);
dict.Add("R" 27);
dict.Add("S" 28);
dict.Add("T" 29);
dict.Add("U" 30);
dict.Add("V" 31);
dict.Add("W" 32);
dict.Add("X" 33);
dict.Add("Y" 34);
dict.Add("Z" 35);
int M = 36;
int pm1 = 0;
for (int i = 0; i < Code.Length; i++)
{
string key = Code[i].ToString();
int s = 0;
if (i == 0)
{
s = M + dict[key];
}
else
{
s = pm1 + dict[key];
}
int sm = s % M;
if (sm == 0)
sm = M;
pm1 = (sm * 2) % (M + 1);
}
int result = 0;
if (pm1 % M != 1)
{
result = (M + 1 - pm1) % M;
}
var MDict = dict.First(P => P.Value == result); return MDict.Key;
}
JAVA版本:
/**
* 校验位获取
*/
String getXy(String XXy){
String Xy=XXy.replace(".""");
int M = 36;
int c = M;
for (int i = 0; i < Xy.length(); i++) {
c = c + getXyzh(Xy.charAt(i));
c = c%M;
if(c == 0){
c = M;
}
c = c * 2;
c = c % (M + 1);
}
int result = 0;
if(c%M != 1){
result = (M + 1 - c) % (M);
}
return getXyint(result);
}
int getXyzh(char c){
List a=new ArrayList();
a.add('0');a.add('1');a.add('2');a.add('3');a.add('4');
a.add('5');a.add('6');a.add('7');a.add('8');a.add('9');
a.add('A');a.add('B');a.add('C');a.add('D');a.add('E');
a.add('F');a.add('G');a.add('H');a.add('I');a.add('J'); a.add('K');a.add('L');a.add('M');a.add('N');a.add('O');
a.add('P');a.add('Q');a.add('R');a.add('S');a.add('T');
a.add('U');a.add('V');a.add('W');a.add('X');a.add('Y');
a.add('Z');
for(int i=0;i<a.size();i++){
if((c+"").equals(a.get(i)+"")){
return i;
}
}
return 0;
}
String getXyint(int i)
{
List a=new ArrayList();
a.add(0);a.add(1);a.add(2);a.add(3);a.add(4);
a.add(5);a.add(6);a.add(7);a.add(8);a.add(9);
a.add('A');a.add('B');a.add('C');a.add('D');a.add('E');
a.add('F');a.add('G');a.add('H');a.add('I');a.add('J'); a.add('K');a.add('L');a.add('M');a.add('N');a.add('O');
a.add('P');a.add('Q');a.add('R');a.add('S');a.add('T');
a.add('U');a.add('V');a.add('W');a.add('X');a.add('Y');
a.add('Z');
return a.get(i)+"";
}。

相关文档
最新文档