以下是我的分析,不知是否正確,你參考下
萬(wàn)安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
1、首先來(lái)看你打java代碼 :crc = (byte) ((crc 1) ^ 0x8c); 和?crc = (byte) (crc 1);?
導(dǎo)致這個(gè)問(wèn)題是因?yàn)閎yte的最高位符號(hào)位,轉(zhuǎn)換的時(shí)候就出錯(cuò)了
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;
}
}
CRC算法實(shí)現(xiàn)有2種方法,一、查表法,二、直接計(jì)算,查表法的計(jì)算速度相對(duì)來(lái)說(shuō)比較快,本人介紹的方法是直接計(jì)算法,用了2種方法實(shí)現(xiàn),都是面向?qū)ο筮M(jìn)行算法的封裝。
package com.wms.serial;
/**
* @author linduo
* @version 2006/08/25
*/
public class CRC16{
public int value;
public CRC16()
{
value = 0;
}
/** update CRC with byte b */
public void update(byte aByte)
{
int a, b;
a = (int) aByte;
for (int count = 7; count =0; count--) {
a = a 1;
b = (a 8) 1;
if ((value 0x8000) != 0) {
value = ((value 1) + b) ^ 0x1021;
} else {
value = (value 1) + b;
}
}
value = value 0xffff;
return;
}
/** reset CRC value to 0 */
public void reset()
{
value = 0;
}
public int getValue()
{
return value;
}
public static void main(String[] args) {
CRC16 crc16 = new CRC16();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
for (int k = 0; k b.length; k++)
{
crc16.update(b[k]);
}
System.out.println(Integer.toHexString(crc16.getValue()));
System.out.println(Integer.toHexString(b.length));
}
}
package com.wms.serial;
public class CRC162 {
public static final void main(String[] args){
CRC162 crc16 = new CRC162();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
System.out.println(Integer.toHexString(crc16.encode(b)));
//再把這個(gè)2f49替換成b數(shù)組的最后兩個(gè)字節(jié)的數(shù)組,生成一個(gè)新的數(shù)組b2
byte[] b2 = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x2f,(byte)0x49
};
System.out.println(Integer.toHexString(crc16.encode(b2))); //算出來(lái)是 0
//你可以自已構(gòu)造一些byte進(jìn)行加解密試試
}
public short encode(byte[] b){
short CRC_x = 0;
int pp = 65536; // 116;
int pp2 = 69665; // (116) + (112) + (15) + 1
for(int i=0;ib.length;i++){
for(int j=0;j8;j++){
CRC_x = (short)((CRC_x1) + (((b[i]j)0x80)7));
if((CRC_x/pp) == 1){
CRC_x=(short)(CRC_x^pp2);
}
}
}
return CRC_x;
}
}
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;
}
}
short CityComGetCRC(final byte[] data,short length){
short?crc=0,q;
short?c,i;
for(i=0;ilength;i++){
c=data[i];
q=(crc^c)0x0f;
crc=(crc4)^(q*0x1081);
q=(crc^(c4))0xf0;
crc=(crc4)^(q*0x1081);
}
return?crc;
}