如题
我手头做一个上位机程序,需要发送命令集,其中就有一个 CRC16效验码的发送。
初涉CRC16 不太懂。时间紧迫。
网上找到的都不能直接用。感谢各位帮帮忙C版本的#define PRESET_VALUE 0xFFFF
#define POLYNOMIAL 0x8408
unsigned int uiCrc16Cal(unsigned char const * pucY, unsigned char ucX)
{
unsigned char ucI,ucJ;
unsigned short int uiCrcValue = PRESET_VALUE; for(ucI = 0; ucI < ucX; ucI++)
{
uiCrcValue = uiCrcValue ^ *(pucY + ucI);
for(ucJ = 0; ucJ < 8; ucJ++)
{
if(uiCrcValue & 0x0001)
{
uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;
}
else
{
uiCrcValue = (uiCrcValue >> 1);
}
}
}
return uiCrcValue;
}C#版本的
public class Crc16
{
private const ushort polynomial = 0x8408;
private ushort[] table = new ushort[256]; public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0xffff;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
} public Crc16()
{
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}可以用 04 00 01 验证。 计算出的CRC16低字节为 DB 高字节为 4B
也可以用 0B 00 01 01 01 04 EE 35 45 45 验证。 结果为 3A 3E 前低为 后高位感谢
我手头做一个上位机程序,需要发送命令集,其中就有一个 CRC16效验码的发送。
初涉CRC16 不太懂。时间紧迫。
网上找到的都不能直接用。感谢各位帮帮忙C版本的#define PRESET_VALUE 0xFFFF
#define POLYNOMIAL 0x8408
unsigned int uiCrc16Cal(unsigned char const * pucY, unsigned char ucX)
{
unsigned char ucI,ucJ;
unsigned short int uiCrcValue = PRESET_VALUE; for(ucI = 0; ucI < ucX; ucI++)
{
uiCrcValue = uiCrcValue ^ *(pucY + ucI);
for(ucJ = 0; ucJ < 8; ucJ++)
{
if(uiCrcValue & 0x0001)
{
uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;
}
else
{
uiCrcValue = (uiCrcValue >> 1);
}
}
}
return uiCrcValue;
}C#版本的
public class Crc16
{
private const ushort polynomial = 0x8408;
private ushort[] table = new ushort[256]; public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0xffff;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
} public Crc16()
{
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}可以用 04 00 01 验证。 计算出的CRC16低字节为 DB 高字节为 4B
也可以用 0B 00 01 01 01 04 EE 35 45 45 验证。 结果为 3A 3E 前低为 后高位感谢
public class Crc16 {
private final int polynomial = 0x8408;
private int[] table = new int[256];
public int ComputeChecksum(int[] bytes) {
int crc = 0xffff;
for (int i = 0; i < bytes.length; ++i) {
int index = (crc ^ bytes[i]) % 256;
crc = (crc >> 8) ^ table[index];
}
return crc;
}
public Crc16() {
int value;
int temp;
for (int i = 0; i < table.length; ++i) {
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j) {
if (((value ^ temp) & 0x0001) != 0) {
value = (value >> 1) ^ polynomial;
} else {
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
public static void main(String[] args) {
Crc16 c = new Crc16();
int[] arr = new int[]{0x4, 0x0, 0x1};
System.out.println(Integer.toString(c.ComputeChecksum(arr), 16));
arr = new int[]{0xB, 0x0, 0x1, 0x1, 0x1, 0x4, 0xEE, 0x35, 0x45, 0x45 };
System.out.println(Integer.toString(c.ComputeChecksum(arr), 16));
}
}
效果是有了,不知道是不是完全正确.