求助大神:帮忙把这个C实现的CRC16算法 改为Java实现,谢谢

zliang_2011 2014-06-17 07:48:31
求助大神,把下面的C语言CRC16算法 改为 Java实现,谢谢啦,急用


static const short Crc_tbl[] = {

0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,

0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,

0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,

0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,

0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,

0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,

0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,

0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,

0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,

0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,

0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,

0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,

0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,

0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,

0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,

0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,

0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,

0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,

0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,

0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,

0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,

0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,

0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,

0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,

0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,

0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,

0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,

0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,

0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,

0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,

0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,

0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202

};



/*获取校验码*/

unsigned short int GetCRC(unsigned char *buf, unsigned long int len)

{

unsigned short int crc = 0, tmpWord = 0;

long int i = 0;



crc = 0;

for (i=0; i < len; i++)

{

tmpWord = crc <<8;

crc >>=8;

crc &= 0xff;

crc ^= (short int)*buf++;

tmpWord ^= Crc_tbl[crc];

crc = tmpWord;

}



tmpWord = crc;

crc = (tmpWord << 8) | (tmpWord >>8);



return crc;

}
main(){
unsigned char a[5] ={(char)0x1b,(char)0x10,(char)0xa4,(char)0x00,(char)0x05};
printf("%d\n", GetCRC(a,5));//输出972
}
...全文
1241 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2014-06-17
  • 打赏
  • 举报
回复
	static final short Crc_tbl[] = { 
		(short)0x0000, (short)0x8005, (short)0x800f, (short)0x000a, (short)0x801b,
		(short)0x001e, (short)0x0014, (short)0x8011, (short)0x8033, (short)0x0036, (short)0x003c, (short)0x8039, (short)0x0028,
		(short)0x802d, (short)0x8027, (short)0x0022, (short)0x8063, (short)0x0066, (short)0x006c, (short)0x8069, (short)0x0078,
		(short)0x807d, (short)0x8077, (short)0x0072, (short)0x0050, (short)0x8055, (short)0x805f, (short)0x005a, (short)0x804b,
		(short)0x004e, (short)0x0044, (short)0x8041, (short)0x80c3, (short)0x00c6, (short)0x00cc, (short)0x80c9, (short)0x00d8,
		(short)0x80dd, (short)0x80d7, (short)0x00d2, (short)0x00f0, (short)0x80f5, (short)0x80ff, (short)0x00fa, (short)0x80eb,
		(short)0x00ee, (short)0x00e4, (short)0x80e1, (short)0x00a0, (short)0x80a5, (short)0x80af, (short)0x00aa, (short)0x80bb,
		(short)0x00be, (short)0x00b4, (short)0x80b1, (short)0x8093, (short)0x0096, (short)0x009c, (short)0x8099, (short)0x0088,
		(short)0x808d, (short)0x8087, (short)0x0082, (short)0x8183, (short)0x0186, (short)0x018c, (short)0x8189, (short)0x0198,
		(short)0x819d, (short)0x8197, (short)0x0192, (short)0x01b0, (short)0x81b5, (short)0x81bf, (short)0x01ba, (short)0x81ab,
		(short)0x01ae, (short)0x01a4, (short)0x81a1, (short)0x01e0, (short)0x81e5, (short)0x81ef, (short)0x01ea, (short)0x81fb,
		(short)0x01fe, (short)0x01f4, (short)0x81f1, (short)0x81d3, (short)0x01d6, (short)0x01dc, (short)0x81d9, (short)0x01c8,
		(short)0x81cd, (short)0x81c7, (short)0x01c2, (short)0x0140, (short)0x8145, (short)0x814f, (short)0x014a, (short)0x815b,
		(short)0x015e, (short)0x0154, (short)0x8151, (short)0x8173, (short)0x0176, (short)0x017c, (short)0x8179, (short)0x0168,
		(short)0x816d, (short)0x8167, (short)0x0162, (short)0x8123, (short)0x0126, (short)0x012c, (short)0x8129, (short)0x0138,
		(short)0x813d, (short)0x8137, (short)0x0132, (short)0x0110, (short)0x8115, (short)0x811f, (short)0x011a, (short)0x810b,
		(short)0x010e, (short)0x0104, (short)0x8101, (short)0x8303, (short)0x0306, (short)0x030c, (short)0x8309, (short)0x0318,
		(short)0x831d, (short)0x8317, (short)0x0312, (short)0x0330, (short)0x8335, (short)0x833f, (short)0x033a, (short)0x832b,
		(short)0x032e, (short)0x0324, (short)0x8321, (short)0x0360, (short)0x8365, (short)0x836f, (short)0x036a, (short)0x837b,
		(short)0x037e, (short)0x0374, (short)0x8371, (short)0x8353, (short)0x0356, (short)0x035c, (short)0x8359, (short)0x0348,
		(short)0x834d, (short)0x8347, (short)0x0342, (short)0x03c0, (short)0x83c5, (short)0x83cf, (short)0x03ca, (short)0x83db,
		(short)0x03de, (short)0x03d4, (short)0x83d1, (short)0x83f3, (short)0x03f6, (short)0x03fc, (short)0x83f9, (short)0x03e8,
		(short)0x83ed, (short)0x83e7, (short)0x03e2, (short)0x83a3, (short)0x03a6, (short)0x03ac, (short)0x83a9, (short)0x03b8,
		(short)0x83bd, (short)0x83b7, (short)0x03b2, (short)0x0390, (short)0x8395, (short)0x839f, (short)0x039a, (short)0x838b,
		(short)0x038e, (short)0x0384, (short)0x8381, (short)0x0280, (short)0x8285, (short)0x828f, (short)0x028a, (short)0x829b,
		(short)0x029e, (short)0x0294, (short)0x8291, (short)0x82b3, (short)0x02b6, (short)0x02bc, (short)0x82b9, (short)0x02a8,
		(short)0x82ad, (short)0x82a7, (short)0x02a2, (short)0x82e3, (short)0x02e6, (short)0x02ec, (short)0x82e9, (short)0x02f8,
		(short)0x82fd, (short)0x82f7, (short)0x02f2, (short)0x02d0, (short)0x82d5, (short)0x82df, (short)0x02da, (short)0x82cb,
		(short)0x02ce, (short)0x02c4, (short)0x82c1, (short)0x8243, (short)0x0246, (short)0x024c, (short)0x8249, (short)0x0258,
		(short)0x825d, (short)0x8257, (short)0x0252, (short)0x0270, (short)0x8275, (short)0x827f, (short)0x027a, (short)0x826b,
		(short)0x026e, (short)0x0264, (short)0x8261, (short)0x0220, (short)0x8225, (short)0x822f, (short)0x022a, (short)0x823b,
		(short)0x023e, (short)0x0234, (short)0x8231, (short)0x8213, (short)0x0216, (short)0x021c, (short)0x8219, (short)0x0208,
		(short)0x820d, (short)0x8207, (short)0x0202 };

	/* 获取校验码 */
	static short GetCRC(byte[] buf, int len) {
		short crc = 0, tmpWord = 0;
		for (int i = 0; i < len; i++) {
			tmpWord = (short)(crc << 8);
			crc >>>= 8;
			crc &= 0xff;
			crc ^= (buf[i]&0xFF);
			tmpWord ^= Crc_tbl[crc];
			crc = tmpWord;
		}
		tmpWord = crc;
		crc = (short)((tmpWord << 8) | (tmpWord >>> 8));
		return crc;
	}

	public static void main(String[] args) {
		byte a[] = new byte[] { (byte) 0x1b, (byte) 0x10, (byte) 0xa4, (byte) 0x00, (byte) 0x05 };
		System.out.format("%d\n", GetCRC(a, 5));// 输出972
	}
rumlee 2014-06-17
  • 打赏
  • 举报
回复
c中的unsigned char,可以直接对应到java中的byte,unsigned char *则直接对应到byte[],unsinged short必须用int再处理,或者用byte[]再处理。 主要是对于unsigned short和unsigned int处理起来可能要稍微麻烦一点。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧