gpt4 book ai didi

c# - 将 C++ i_pwCalculateCRC16Continuation 移植到 C#

转载 作者:行者123 更新时间:2023-11-28 08:02:34 26 4
gpt4 key购买 nike

如何将下列C++正确转换成C#?

//--------------------------------------------------------------------
// Calculate a 16-bit Cycle Redundency Check (CRC) value on a block of //data.
//
// Params:
// pData : Pointer to data to calculate CRC.
// dwSize : Size of data in bytes.
//
// Return:
// 16-bit CRC value.
//
// Notes:
//--------------------------------------------------------------------
private WORD i_pwCalculateCRC16Continuation(PBYTE pData, WORD dwSize, WORD wCRC)
{
// high byte of CRC initialized
BYTE cCRCHi = (BYTE) ((wCRC >> 8) & 0xFF);
// low byte of CRC initialized
BYTE cCRCLo = (BYTE) (wCRC & 0xFF);
// will index into CRC lookup table
BYTE cIndex;
while (dwSize--) // step through each byte of data
{
cIndex = cCRCHi ^ *pData++; // calculate the CRC
cCRCHi = cCRCLo ^ m_cCRCHiArray[cIndex];
cCRCLo = m_cCRCLoArray[cIndex];
}
return (cCRCHi << 8) + cCRCLo;
}

我找到了一个转换它的工具,但它并不完美,而且它不理解上下文。

private ushort i_pwCalculateCRC16Continuation(ref byte pData, ushort dwSize, ushort wCRC)
{
byte cCRCHi = (byte) ((wCRC >> 8) & 0xFF);
byte cCRCLo = (byte) (wCRC & 0xFF);
byte cIndex;

while (dwSize-- > 0)
{
// Cannot convert source type 'int' to target type 'byte'
cIndex = cCRCHi ^ pData++;
// Cannot apply indexing to an expression of type 'byte'
cCRCHi = cCRCLo ^ m_cCRCHiArray[cIndex];
// Cannot apply indexing to an expression of type 'byte'
cCRCLo = m_cCRCLoArray[cIndex];
}
// Cannot convert expression type 'int' to return type 'ushort'
return (cCRCHi << 8) + cCRCLo;
}

CRC 概念和位操作对我来说有点陌生,我不太理解上面的代码。因此我不知道如何“修复”它。

谢谢

编辑:遗漏了以下变量。

private static byte[] m_cCRCHiArray = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x81, 0x40
};

private static byte[] m_cCRCLoArray = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0x80, 0x40
};

最佳答案

试试这个:

private static byte[] m_cCRCHiArray = { 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x81, 0x40
};

private static byte[] m_cCRCLoArray = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0x80, 0x40
};

private ushort i_pwCalculateCRC16Continuation(byte[] data, ushort wCRC)
{
byte cCRCHi = (byte)((wCRC >> 8) & 0xFF);
byte cCRCLo = (byte)(wCRC & 0xFF);

byte cIndex;

for (int i=0; i < data.Length; i++)
{
cIndex = (byte)(cCRCHi ^ data[i]);
cCRCHi = (byte)(cCRCLo ^ m_cCRCHiArray[cIndex]);
cCRCLo = m_cCRCLoArray[cIndex];
}

return (byte)((cCRCHi << 8) + cCRCLo);
}

乍一看并没有明显错误;-)

除了将 pData 更改为 data

之外,我没有更改任何匈牙利符号

关于c# - 将 C++ i_pwCalculateCRC16Continuation 移植到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11046638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com