java 实现crc16校验算法的问题
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。java程序实现...
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。
java程序实现为
public class CRC16 {
public static byte[] getBytes(String abc){
String tmp="";
byte[] bytes=new byte[abc.length()/2];
for(int i=0;i<abc.length()-1;i++){
if(i%2==0){
tmp=abc.substring(i,i+2);
bytes[i/2]=(byte)Integer.parseInt(tmp, 16);
}
}
return bytes;
}
public static String getCRC(String str){
String back="";
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
String tmp="";
byte[] bytes=new byte[str.length()/2];
for(int i=0;i<str.length()-1;i++){
if(i%2==0){
tmp=str.substring(i,i+2);
bytes[i/2]=(byte)Integer.parseInt(tmp, 16);
}
}
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit) {
crc ^= polynomial;
}
}
}
crc &= 0xffff;
back=Integer.toHexString(crc);
int n=4-back.length();
String t="";
for(int i=0;i<n;i++){
t=t+"0";
}
back=t+back;
System.out.println(back);
return back;
}
public static void main(String[] args) {
//对于较短长16进制字串校验是正确的 下面这个字符串校验码是3EB2
String a="000000480001EC29100105BDB344010000000000000005BDB34439363738323135363232312E3139392E31332E3230320000000000000000000000000000000000002329";
CRC16.getCRC(a);
//但是对于长16进制串的校验就不正确了, 正确的校验码应该是CC69
String b="0000005A000000AF120005BDB3440100000000000000C4FE413233313635000000000000000000000000000212020000002400080607DC0D3903065609ED02525AC00000000000000000000900000000000300000000";
CRC16.getCRC(b);
}
}
请问大家有人知道这些什么原因吗 展开
java程序实现为
public class CRC16 {
public static byte[] getBytes(String abc){
String tmp="";
byte[] bytes=new byte[abc.length()/2];
for(int i=0;i<abc.length()-1;i++){
if(i%2==0){
tmp=abc.substring(i,i+2);
bytes[i/2]=(byte)Integer.parseInt(tmp, 16);
}
}
return bytes;
}
public static String getCRC(String str){
String back="";
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
String tmp="";
byte[] bytes=new byte[str.length()/2];
for(int i=0;i<str.length()-1;i++){
if(i%2==0){
tmp=str.substring(i,i+2);
bytes[i/2]=(byte)Integer.parseInt(tmp, 16);
}
}
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit) {
crc ^= polynomial;
}
}
}
crc &= 0xffff;
back=Integer.toHexString(crc);
int n=4-back.length();
String t="";
for(int i=0;i<n;i++){
t=t+"0";
}
back=t+back;
System.out.println(back);
return back;
}
public static void main(String[] args) {
//对于较短长16进制字串校验是正确的 下面这个字符串校验码是3EB2
String a="000000480001EC29100105BDB344010000000000000005BDB34439363738323135363232312E3139392E31332E3230320000000000000000000000000000000000002329";
CRC16.getCRC(a);
//但是对于长16进制串的校验就不正确了, 正确的校验码应该是CC69
String b="0000005A000000AF120005BDB3440100000000000000C4FE413233313635000000000000000000000000000212020000002400080607DC0D3903065609ED02525AC00000000000000000000900000000000300000000";
CRC16.getCRC(b);
}
}
请问大家有人知道这些什么原因吗 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询