2016-08-19 1 views
0

Visual Basic에서 C#으로 비트 연산을 사용하여 함수를 변환하려고하면 결과가 혼합됩니다.Visual Basic에서 C#으로 비트 단위 연산 변환

나는 정말로 (시각적으로) 기본적인 것을 놓치고 있다고 확신한다. 다음

{&H47, &H41, &H50, &H53, &H41, &HC, &H0, &H1, &H0, &H0, &H0, &HFF} 

CRCresult가 나타납니다 : 내가이 배열의 첫 번째 8 개 용어를 공급하는 경우

Dim CRCresult As UInt16 = 0 
Dim CRC_16_POLY As UInt16 = &HA001 

Private Sub CRC16(newByte As Byte) 
    CRCresult = CRCresult Xor newByte 
    For i As Integer = 0 To 7 
     If (CRCresult And &H1) Then 
      CRCresult = (CRCresult >> 1) Xor CRC_16_POLY 
     Else 
      CRCresult = (CRCresult >> 1) 
     End If 
    Next 
End Sub 

:

12864, 49395, 31104, 40248, 9949, 23782, 35549, 39307 

이 아래는

여기에 원래 VB 코드의 C#으로 번역 :

내가이 배열의 첫 번째 8 개 용어를 공급하는 경우
private UInt16 CRCresult = 0; 
private UInt16 CRC_16_POLY = 0xA001; 

private void CRC16(byte newByte) 
{ 
    CRCresult = (UInt16)(CRCresult^newByte); 
    for (int i = 0; i <= 7; i++) { 
     if((CRCresult & 0x1) != 0) 
     { 
      CRCresult = (UInt16)((CRCresult >> 1)^CRC_16_POLY); 
     } else 
     { 
      CRCresult = (UInt16)(CRCresult >> 1); 
     } 
    } 
} 

는 다음과 같이

{ 0x47, 0x41, 0x50, 0x53, 0x41, 0xC, 0x0, 0x1, 0x0, 0x0, 0x0, 0xFF } 

CRCresult가 나타납니다

요약
12864, 49395, 31104, 40248, 57948, 15586, 18876, 29065 

newBytes   CRCresult 
    VB | C# |  VB | C# 
------------- --------------- 
&H47 | 0x47 |  12864 | 12864 
&H41 | 0x41 |  49395 | 49395 
&H50 | 0x50 |  31104 | 31104 
&H53 | 0x53 |  40248 | 40248 
&H41 | 0x41 |  9949 | 57948 
&HC | 0xC |  23782 | 15586 
&H0 | 0x0 |  35549 | 18876 
&H1 | 0x1 |  39307 | 29065 
&H0 | 0x0 | 
&H0 | 0x0 | 
&H0 | 0x0 | 
&HFF | 0xFF | 

나는 무엇을 놓치고 내 결과의 차이를 일으키는 번역?

+0

방금 ​​코드를 시도하고 VB 출력과 동일한 결과가 나타났습니다. 마지막 결과를 보여주지 못했기 때문에 더 많은 결과를 얻었습니다. 'CRC16'을 어떻게 사용하는지 보여줄 수 있습니까? 그 결과를 얻으시겠습니까? – juharr

+0

참고하시기 바랍니다, 제가 전화를 걸었습니다. 'foreach (새로운 바이트의 새로운 바이트 [var {0x47, 0x41, 0x50, 0x53, 0x41, 0xC, 0x0, 0x1, 0x0, 0x0, 0x0, 0xFF}) { CRC16 (b); Console.WriteLine (CRCresult); }'. 또한 변수와 메소드를'정적'으로 만들었습니다. 왜냐하면 이것은'메인 '콘솔 프로그램에서 호출 되었기 때문입니다. – juharr

+0

'for (int k = 0; k <= message.Length - 5; k ++) { \t CRC16 (message [k]); }' 여기서 message는 배열입니다. – bigLarry

답변

0

모두 구현이 정확하고 생성 동일한 결과

난 (인덱스 4), POS (5)에서 다른 값을 가지는 시퀀스를 발견 &H4f 대신

&H41 thisgenerate하여 (VB) 결과 :

{&H47, &H41, &H50, &H53, &H4f, &HC, &H0, &H1, &H0, &H0, &H0, &HFF} 

및 이에 대한 (C#) 결과 :

{&H47, &H41, &H50, &H53, &H41, &HC, &H0, &H1, &H0, &H0, &H0, &HFF} 

테스트 데이터에 작은 타이핑 오류가 있습니까? :-)

+0

예. 그것을 던져라. 내가 보지 못했던 메시지 배열의 변화가 있습니다. bigLarry