十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
由于res定义为unsigned int,所以包含4个字节;而p是unsigned char的指针,指向的数据是1个字节。
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计、网站制作、黄冈网络推广、成都小程序开发、黄冈网络营销、黄冈企业策划、黄冈品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供黄冈建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
所以常规来说,假如res由byte3 byte2 byte1 byte0构成,那么p[0]=byte0,p[1]=byte1,p[2]=byte2,p[3]=byte4,也就是p[0]是最低字节,p[3]是最高字节。
但是还要看系统硬件连接,是big endian还是 little endian,如果是 little endian那么就是常规情况,和上面一样。如果是big endian,那么数据存放是倒过来的,也就是p[0]是最高字节,p[3]是最低字节,全部情况是p[0]=byte3,p[1]=byte2,p[2]=byte1,p[3]=byte0。
代码如下
public static byte CRC8(byte[] buffer)
{
byte crc = 0;
for (int j = 0; j buffer.Length; j++)
{
crc ^= buffer[j];
for (int i = 0; i 8; i++)
{
if ((crc 0x01) != 0)
{
crc = 1;
crc ^= 0x8c;
}
else
{
crc = 1;
}
}
}
return crc;
}
在线生成工具
这个生成的是function,不可综合的。自己改成module就行了
////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1999-2008 Easics NV.
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// Purpose : synthesizable CRC function
// * polynomial: (0 3 4 5 8)
// * data width: 8
//
// Info : tools@easics.be
//
////////////////////////////////////////////////////////////////////////////////
module CRC8_D8;
// polynomial: (0 3 4 5 8)
// data width: 8
// convention: the first serial bit is D[7]
function [7:0] nextCRC8_D8;
input [7:0] Data;
input [7:0] crc;
reg [7:0] d;
reg [7:0] c;
reg [7:0] newcrc;
begin
d = Data;
c = crc;
newcrc[0] = d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[4] ^ c[5] ^ c[6];
newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[1] ^ c[1] ^ c[4] ^ c[5] ^ c[6] ^ c[7];
newcrc[2] = d[7] ^ d[6] ^ d[5] ^ d[2] ^ c[2] ^ c[5] ^ c[6] ^ c[7];
newcrc[3] = d[7] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[7];
newcrc[4] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[4];
newcrc[5] = d[6] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[6];
newcrc[6] = d[7] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[7];
newcrc[7] = d[5] ^ d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4] ^ c[5];
nextCRC8_D8 = newcrc;
end
endfunction
endmodule
以下是我的分析,不知是否正确,你参考下1、首先来看你打java代码:crc=(byte)((crc1)^0x8c);和 crc=(byte)(crc1); 导致这个问题是因为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 1) ^ 0x8c;} else {crc = crc 1;}}}return (byte) crc;}}
public static byte CRC8(byte[] buffer,byte poly)
{
byte crc = 0;
byte CRCPoly = poly;
for (int j = 0; j buffer.Length; j++)
{
crc ^= buffer[j];
for (int i = 0; i 8; i++)
{
if ((crc 0x80) != 0)
{
crc = 1;
crc ^= CRCPoly;
}
else
{
crc = 1;
}
}
}
crc = Convert.ToByte(crc ^ 0x00);
return crc;
}
由于多项式的最高为都为1,并且在代码的crc8计算中,最高位也是不使用的,
所以在多项式记录时都去掉了最高位。
CRC校验算法,说白了,就是把需要校验的数据与多项式进行循环异或(XOR),
但进行XOR的方式与实际中数据传输时,是高位先传、还是低位先传有关。对于数据
高位先传的方式,XOR从数据的高位开始,我们就叫它顺序异或吧;对于数据低位先
传的方式,XOR从数据的低位开始,我们就叫它反序异或吧。两种不同的异或方式,
即使对应相同的多项式,计算出来的结果也是不一样的。
下面以顺序异或的例子说明一些计算的过程:
使用多项式:x8+x5+x4+1(二进制为:100110001)
计算一个字节:0x11(二进制为:00010001)
计算步骤:
A、 因为采用顺序异或,所以需要计算的数据左移8位,
移位后数据为:0001 0001 0000 000
B、 先进行高9bit异或(多项式为9bit),0001 0001 0000 0000,因为高9bit的
最高bit为0,不需要进行异或,同理,接下来的两bit也是0,也不需要进行进行异或。
这样处理后数据为:1 0001 0000 0000;
C、 接下来最高位为1,需要进行异或操作了
(搬运by:简单的过客)