我试图将几个简单的CRC计算函数从C
转换为C#
,但我似乎得到的结果不正确。将CRC函数从C转换为C#会产生错误的值
的C
功能是:
#define CRC32_POLYNOMIAL 0xEDB88320
unsigned long CRC32Value(int i)
{
int j;
unsigned long ulCRC;
ulCRC = i;
for (j=8;j>0;j--)
{
if (ulCRC & 1)
ulCRC = (ulCRC >> 1)^CRC32_POLYNOMIAL;
else
ulCRC >>= 1;
}
return ulCRC;
}
unsigned long CalculateBlockCRC32(
unsigned long ulCount,
unsigned char *ucBuffer)
{
unsigned long ulTemp1;
unsigned long ulTemp2; unsigned long ulCRC = 0;
while (ulCount-- != 0)
{
ulTemp1 = (ulCRC >> 8) & 0x00FFFFFFL;
ulTemp2 = CRC32Value(((int)ulCRC^*ucBuffer++)&0xff);
ulCRC = ulTemp1^ulTemp2;
}
return(ulCRC);
}
这些明确定义的,它们是从用户手册服用。我的C#的这些功能的版本是:
private ulong CRC32POLYNOMIAL = 0xEDB88320L;
private ulong CRC32Value(int i)
{
int j;
ulong ulCRC = (ulong)i;
for (j = 8; j > 0; j--)
{
if (ulCRC % 2 == 1)
{
ulCRC = (ulCRC >> 1)^CRC32POLYNOMIAL;
}
else
{
ulCRC >>= 1;
}
}
return ulCRC;
}
private ulong CalculateBlockCRC32(ulong ulCount, byte[] ucBuffer)
{
ulong ulTemp1;
ulong ulTemp2;
ulong ulCRC=0;
int bufind=0;
while (ulCount-- != 0)
{
ulTemp1 = (ulCRC >> 8) & 0x00FFFFFFL;
ulTemp2 = CRC32Value(((int)ulCRC^ucBuffer[bufind]) & 0xFF);
ulCRC = ulTemp1^ulTemp2;
bufind++;
}
return ulCRC;
}
正如我提到的,还有C
版本和C#
版本之间的差异。一个可能的来源是我对C
表达式ulCRC & 1
的理解,我相信这只对奇数有效。
我称之为C#
功能是这样的:
string contents = "some data";
byte[] toBeHexed = Encoding.ASCII.GetBytes(contents);
ulong calculatedCRC = this.CalculateBlockCRC32((ulong)toBeHexed.Length, toBeHexed);
而且C
函数被调用是这样的:
char *Buff="some data";
unsigned long iLen = strlen(Buff);
unsigned long CRC = CalculateBlockCRC32(iLen, (unsigned char*) Buff);
我相信我打电话,在每一种语言相同的数据的功能, 那是对的吗?如果有人能够对此有所了解,我将非常感激。
C中的'unsigned long'是C#中的'uint'(实际上使用'modopt(long)uint')。 C中的'ulong'是C中的'unsigned long long'。 – 2014-08-27 09:58:22
如果你知道有些地方存在差异,你能不能仅仅调试两个程序来找出它们的行为不同?即有很多单元测试并用它们来追踪你的错误。 – Chris 2014-08-27 09:59:00
另外我认为这可能更适合http://codereview.stackexchange.com/(尽管我可能是错的,我不常去那里)。堆栈溢出更多的是帮助解决特定的问题,而不仅仅是“我的程序没有达到我期望的水平”。 – Chris 2014-08-27 10:01:58