다음 C++을 C#으로 올바르게 변환하는 방법은 무엇입니까?포트 C++ i_pwCalculateCRC16Contactation to 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
};
일반 문제 (나는 코드를 실행하기에는 너무 게으른 편이다!)에서 언급 할 수 없지만 가장 명백한 문제는 C++ 코드의'pData'가 단순히 노래를 가리키는 포인터가 아닌 버퍼라는 것입니다 le 바이트 값. 버퍼의 길이는 아마도 dwSize에 저장됩니다. C# 코드는 a) 'byte [] data' 배열 또는 b)'stream dataStream, int countBytes' 중 하나를 취해야합니다. 멤버 변수'm_cCRCHiArray'는 또한 바이트 배열이어야합니다. – Rook
pData가 바이트 배열 인 경우 pData 증분 (pData ++)은 무엇을 의미합니까? 귀하의 의견에 감사드립니다. –
C 및 C++에서 반복적으로 포인터를 증가시킴으로써 C 스타일 배열을 반복 할 수 있습니다. 이것은 C#에서는 작동하지 않습니다. 'pData'가 C# 배열이라면 루프는'for (int i = 0; i
Rook