2012-06-15 3 views
0

다음 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 
}; 
+0

일반 문제 (나는 코드를 실행하기에는 너무 게으른 편이다!)에서 언급 할 수 없지만 가장 명백한 문제는 C++ 코드의'pData'가 단순히 노래를 가리키는 포인터가 아닌 버퍼라는 것입니다 le 바이트 값. 버퍼의 길이는 아마도 dwSize에 저장됩니다. C# 코드는 a) 'byte [] data' 배열 또는 b)'stream dataStream, int countBytes' 중 하나를 취해야합니다. 멤버 변수'm_cCRCHiArray'는 또한 바이트 배열이어야합니다. – Rook

+0

pData가 바이트 배열 인 경우 pData 증분 (pData ++)은 무엇을 의미합니까? 귀하의 의견에 감사드립니다. –

+1

C 및 C++에서 반복적으로 포인터를 증가시킴으로써 C 스타일 배열을 반복 할 수 있습니다. 이것은 C#에서는 작동하지 않습니다. 'pData'가 C# 배열이라면 루프는'for (int i = 0; i Rook

답변

1

이 시도 :

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); 
} 

내가 datapData을 변경을 제외하고는 헝가리어 표기법의 어떤 변경되지했습니다 언뜻 ;-)

에서 분명히 잘못된 아니다

+0

구문이 정확합니다. 이제는 테스트 케이스를 설정하고 실제로 생성 된 결과가 올바른지 확인하는 데 시간이 좀 걸릴 것입니다. 감사! –

+0

wCRC 매개 변수가 무엇이고 값이 어떨지 알고 싶습니다. CRC 값을 낮추고 높은 값을 얻어야한다는 것을 알고 있습니다. –

+2

[이 pdf] (http://www.clarityvisual.com/partners/common/docs/techresources/Bobcat/070-0108-01_Bobcat_I_RS232.pdf)의 맨 마지막 부분을 보면 CRC 계산은 0xFFFF입니다. 이 코드는 사용하는 코드와 동일하므로 아마 받아 들일만한 합리적인 방법 일 것입니다. – Rook