2016-08-19 18 views
0

Visual BasicからC#へのビット単位操作を使用して関数を変換しようとすると、結果が混在します。Visual BasicからC#へのビット単位操作の変換

本当に(視覚的に)基本的なものが欠けていると確信しています。ここで

は、元のVBのコードです:私はそれをこの配列の最初の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 

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

を次のようにCRCresultが表示されます。以下は

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

です私のC#への翻訳:

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

私はそれをこの配列の最初の8項養うとき:

{ 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出力と同じ結果を得ました。ただし、あなたが最後の4を表示していないように見えるので、より多くの結果が得られます。 'CRC16'その結果を得る? – juharr

+0

参考に、ここで私はそれをどのように呼んでいたのですか。 'foreach(新しいバイトの{0x47、0x41、0x50、0x53、0x41、0xC、0x0、0x1、0x0、0x0、0x0、0xFF}のvar b) { CRC16(b); Console.WriteLine(CRCresult); } '。 また、これはコンソールプログラム 'Main'から呼び出されていたので、変数とメソッドを静的にしました。 – juharr

+0

'for(int k = 0; k <= message.Length - 5; k ++) { \t CRC16(message [k]); } ' ここで、messageは配列です。 – bigLarry

答えて

0

両方の実装が正しいと生成同じ結果

iは(指標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

関連する問題