short city_com_get_crc(short[] pData, short length) {
目前创新互联已为上1000家的企业提供了网站建设、域名、虚拟空间、网站托管运营、企业网站设计、四川网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
short crc = 0, q;
short c, i;
for(i = 0; i length; i++) {
c = pData[i]; q = (crc ^ c) 0x0F;
crc = (crc 4) ^(q * 0x1081);
q = (crc ^(c 4)) 0xF0;
crc = (crc 4) ^(q * 0x1081);
}
return (((crc 8) 0xFF00) | ((crc 8) 0xFF));
}
随便丢到哪个类里面吧。
unsigned short 都替换为int
unsigned int 也替换为int
unsigned char const *buf替换为byte[] buf
*buf++替换为buf[i]
private static String mkCrc16(String str) {
CRC16 crc16 = new CRC16();
byte[] b = str.getBytes();
for (int i = 0; i b.length; i++)
crc16.update(b[i]);
return Integer.toHexString(crc16.value);
}
private static String mkCrc(String string) throws Exception {
CRC32 crc32 = new CRC32();
crc32.update(string.getBytes());
return Long.toHexString(crc32.getValue());
}
public class CRCUtil {
public static final int evalCRC16(byte[] data) {
int crc = 0xFFFF;
for (int i = 0; i data.length; i++) {
crc = (data[i] 8) ^ crc;
for (int j = 0; j 8; ++j)
if ((crc 0x8000) != 0)
crc = (crc 1) ^ 0x1021;
else
crc = 1;
}
return (crc ^ 0xFFFF) 0xFFFF;
}
}
实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。
应用例子:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。 实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。
应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。
bcc异或校验法(block check character)
实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
校验值计算的代码类似于:
unsigned uCRC=0;//校验初始值
for(int i=0;iDataLenth;i++) uCRC^=Data[i];
适用范围:适用于大多数要求不高的数据通讯。
应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。 (Cyclic Redundancy Check)
实现方法:这是利用除法及余数的原理来进行错误检测的
以下是我的分析,不知是否正确,你参考下
1、首先来看你打java代码 :crc = (byte) ((crc 1) ^ 0x8c); 和 crc = (byte) (crc 1);
导致这个问题是因为byte的最高位符号位,转换的时候就出错了
2、示例代码:
package com.test;
public class test {
public static void main(String[] args) {
byte[] ptr = { 1, 1, 1, 1, 1, 1 };
byte res = getCrc(ptr);
System.out.println();
System.out.println((byte)( (1 1) ^ 0x8c ) + ":" +( (1 1) ^ 0x8c ) );
}
public static byte getCrc(byte[] ptr) {
int crc = 0;
for (int i = 0; i ptr.length; i++) {
crc ^= ptr[i];
for (int j = 0; j 8; j++) {
if ((crc 0x01) != 0) {
crc = (crc 1) ^ 0x8c;
} else {
crc = crc 1;
}
}
}
return (byte) crc;
}
}
/******************************************************************************
* Name: CRC-32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
* Poly: 0x4C11DB7
* Init: 0xFFFFFFF
* Refin: False
* Refout: False
* Xorout: 0x0000000
* Note:
*****************************************************************************/
uint32_t crc32_mpeg_2(uint8_t *data, uint_len length)
{
uint8_t i;
uint32_t crc = 0xffffffff; // Initial value
while(length--)
{
crc ^= (uint32_t)(*data++) 24;// crc ^=(uint32_t)(*data)24; data++;
for (i = 0; i 8; ++i)
{
if ( crc 0x80000000 )
crc = (crc 1) ^ 0x04C11DB7;
else
crc = 1;
}
}
return crc;
}
————————————————
版权声明:本文为CSDN博主「e1ki0lp」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接: