在 C 和 C# 之间迁移 CRC 计算
Migrating CRC calculations between C and C#
我正在尝试在我的 C# 程序中实施 crc 计算。我从设备 C 程序中获得了代码片段,但我无法将它实现到我的程序中。
这是我得到的代码:
uint16_t oblicz_crc(uint8_t* buffer, uint8_t length)
{
uint16_t crc = 0xffff;
uint8_t i, j;
for(i=0;i<length;i++)
{
crc ^= *(buffer+i);
for(j=0;j<8;j++)
{
3
if(crc & 0x0001)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return(crc);
}
而且我的程序中已有一个代码。我假设某些二元运算符、"if ((crc & 0x0001) == 1)" 片段或某些数据类型是错误的。你能帮我解决这个问题吗?
public void Send_Frame(byte[] buffer)
{
byte[] checksum = Crc(buffer); //Array.Reverse(arg) ??
Array.Resize(ref buffer, buffer.Length + 2);
Array.Copy(checksum, 0, buffer, buffer.Length - 2, 2);
#if DEBUG
richTextBoxPreview.AppendText( BitConverter.ToString(buffer) + "\n");
#endif
//Port.Write(buffer);
}
private byte[] Crc(byte[] buffer)
{
UInt16 crc = 0xFFFF;
int i, j;
for (i = 0; i < buffer.Length; i++)
{
crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i);
for (j = 0; j < 8; j++)
{
if ((crc & 0x0001) == 1)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return BitConverter.GetBytes(crc);
}
PS:这个问题是关于我的具体代码片段的。当我得到答复时,最好将其删除吗?还是我应该离开它?
这个有用吗?
public static ushort oblicz_crc(byte[] buffer, int length)
{
unchecked
{
ushort crc = 0xffff;
for (int i = 0; i < length; i++)
{
crc ^= buffer[i];
for (int j = 0; j < 8; j++)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return (crc);
}
}
问题出在这一行:
crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i);
在原代码中是:
crc ^= *(buffer+i);
原始代码是将 i 添加到缓冲区指针,然后取消对该位置的引用。如果将代码更改为:
crc ^= (ushort)(buffer[i]);
那你实际上是在做同样的操作
我正在尝试在我的 C# 程序中实施 crc 计算。我从设备 C 程序中获得了代码片段,但我无法将它实现到我的程序中。
这是我得到的代码:
uint16_t oblicz_crc(uint8_t* buffer, uint8_t length)
{
uint16_t crc = 0xffff;
uint8_t i, j;
for(i=0;i<length;i++)
{
crc ^= *(buffer+i);
for(j=0;j<8;j++)
{
3
if(crc & 0x0001)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return(crc);
}
而且我的程序中已有一个代码。我假设某些二元运算符、"if ((crc & 0x0001) == 1)" 片段或某些数据类型是错误的。你能帮我解决这个问题吗?
public void Send_Frame(byte[] buffer)
{
byte[] checksum = Crc(buffer); //Array.Reverse(arg) ??
Array.Resize(ref buffer, buffer.Length + 2);
Array.Copy(checksum, 0, buffer, buffer.Length - 2, 2);
#if DEBUG
richTextBoxPreview.AppendText( BitConverter.ToString(buffer) + "\n");
#endif
//Port.Write(buffer);
}
private byte[] Crc(byte[] buffer)
{
UInt16 crc = 0xFFFF;
int i, j;
for (i = 0; i < buffer.Length; i++)
{
crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i);
for (j = 0; j < 8; j++)
{
if ((crc & 0x0001) == 1)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return BitConverter.GetBytes(crc);
}
PS:这个问题是关于我的具体代码片段的。当我得到答复时,最好将其删除吗?还是我应该离开它?
这个有用吗?
public static ushort oblicz_crc(byte[] buffer, int length)
{
unchecked
{
ushort crc = 0xffff;
for (int i = 0; i < length; i++)
{
crc ^= buffer[i];
for (int j = 0; j < 8; j++)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return (crc);
}
}
问题出在这一行:
crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i);
在原代码中是:
crc ^= *(buffer+i);
原始代码是将 i 添加到缓冲区指针,然后取消对该位置的引用。如果将代码更改为:
crc ^= (ushort)(buffer[i]);
那你实际上是在做同样的操作