我試圖將幾個簡單的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