crc16.h
#define CRC16_POLY 0x8005
#define CRC_INIT 0x0
unsigned short GenCRC16(char *p, int n);crc16.cpp
unsigned short GenCRC16(char *p, int n)
{
int i,j;
char Data;
unsigned short checksum = CRC_INIT;
for(i = 0; i < n; i++){
Data = *p++;
for (j = 0; j < 8; j++) {
if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
checksum= (checksum << 1) ^ CRC16_POLY;
else
checksum = (checksum << 1);
Data <<= 1;
}
} return checksum;
}
#define CRC16_POLY 0x8005
#define CRC_INIT 0x0
unsigned short GenCRC16(char *p, int n);crc16.cpp
unsigned short GenCRC16(char *p, int n)
{
int i,j;
char Data;
unsigned short checksum = CRC_INIT;
for(i = 0; i < n; i++){
Data = *p++;
for (j = 0; j < 8; j++) {
if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
checksum= (checksum << 1) ^ CRC16_POLY;
else
checksum = (checksum << 1);
Data <<= 1;
}
} return checksum;
}
{
int i,j;
byte Data;ushort checksum = CRC_INIT; for(i = 0; i < p.Length; i++){
Data = p[i];
for (j = 0; j < 8; j++) {
if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
checksum= (checksum < < 1) ^ CRC16_POLY;
else
checksum = (checksum < < 1); Data < <= 1;
}
}return checksum;
} 未经编译
ushort GenCRC16(char[] p, int n)
{
int i, j;
char Data; ushort checksum = CRC_INIT; for (i = 0; i < n; i++)
{
Data = *p++;
for (j = 0; j < 8; j++)
{
if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
checksum = (checksum << 1) ^ CRC16_POLY;
else
checksum = (checksum << 1); Data <<= 1;
}
} return checksum;
}
{
int i, j;
byte Data;
ushort checksum = CRC_INIT;
for (i = 0; i < p.Length; i++)
{
Data = p[i];
for (j = 0; j < 8; j++)
{
if (((checksum & 0x8000) >> 8) != (Data & 0x80))
checksum = (ushort)((checksum << 1) ^ CRC16_POLY);
else
checksum = (ushort)(checksum << 1); Data = (byte)(Data << 1);
}
}
return checksum;
}修改成这样之后编译是能成功的,但是得出的校验码与C++里面得出的校验码不同; 谢谢
wuyazhe, 谢谢你的回复, Data = *p++; 这句在C#是不能通过编译的, C# 不能执行这句(将当前指针的值赋值给Data,并指向下一个指针);if (((checksum & 0x8000) >> 8) ^ (Data & 0x80)) 这句返回的是int型, 不是C++里面的bool;谢谢
public static ushort CRC_INIT = 0x0;
public ushort GenCRC16(byte[] p)
{
int i, j;
byte Data; ushort checksum = CRC_INIT; for (i = 0; i < p.Length; i++)
{
Data = p[i];
for (j = 0; j < 8; j++)
{
if ((((checksum & 0x8000) >> 8) ^ (Data & 0x80)) != 0)
checksum = (ushort)((checksum << 1) ^ CRC16_POLY);
else
checksum = (ushort)(checksum << 1); Data <<= 1;
}
} return checksum;
}
private void button2_Click(object sender, EventArgs e)
{
byte[] b = new byte[] { 1, 2, 3 };
ushort r = GenCRC16(b);
textBox5.Text = r.ToString();
}
谢谢 soaringbird 的回复, 这个校验结果依然和C++的校验结果不一致;
See the comments at the top of Terminal.cs for information.在C#里先把这个字串给转成16进制, 然后再转成byte[];最后传入GenCRC16(byte[] p),得出结果2550; C++里面得出结果:0x2B0C; 十进制:11020
char*p1="See the comments at the top of Terminal.cs for information.";
unsigned short rr= GenCRC16(p1,59);
printf("%d\n",rr);