2016-05-11 6 views
1

私はC#プログラムにcrc計算を実装しようとしています。デバイスCプログラムからコードスニペットを取得しましたが、プログラムに実装できません。ここでCとCの間のCRC計算の移行

は、私が持っているコードです:

uint16_t oblicz_crc(uint8_t* buffer, uint8_t length) 
{ 
    uint16_t crc = 0xffff; 
    uint8_t i, j; 
    for(i=0;i<length;i++) 
    { 
    crc ^= *(buffer+i); 
    for(j=0;j<8;j++) 
     { 
     3 
     if(crc & 0x0001) 
      { 
      crc >>= 1; 
      crc ^= 0xA001; 
      } 
     else 
      { 
      crc >>= 1; 
      } 
     } 
    } 
return(crc); 
} 

そして、私はすでに私のプログラムを持っているコードがあります。私はいくつかのバイナリ演算子、 "if((crc & 0x0001)== 1)"フラグメント、または一部のデータ型が間違っていると仮定します。これで私を助けることができますか?

 public void Send_Frame(byte[] buffer) 
     { 
      byte[] checksum = Crc(buffer); //Array.Reverse(arg) ?? 
      Array.Resize(ref buffer, buffer.Length + 2); 
      Array.Copy(checksum, 0, buffer, buffer.Length - 2, 2); 
#if DEBUG 
      richTextBoxPreview.AppendText(BitConverter.ToString(buffer) + "\n"); 
#endif 
      //Port.Write(buffer); 
     } 
     private byte[] Crc(byte[] buffer) 
     { 
      UInt16 crc = 0xFFFF; 
      int i, j; 
      for (i = 0; i < buffer.Length; i++) 
      { 
       crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i); 
       for (j = 0; j < 8; j++) 
       { 
        if ((crc & 0x0001) == 1) 
        { 
         crc >>= 1; 
         crc ^= 0xA001; 
        } 
        else 
        { 
         crc >>= 1; 
        } 
       } 
      } 
      return BitConverter.GetBytes(crc); 
     } 

PS:この質問は私の特定のコードスニペットです。私が答えを得るとき、それを削除するのが最善でしょうか?または私はそれを残す必要がありますか?

+0

他の人にも便益が出るようにしておいてください – torox

答えて

1

これは機能しますか?

public static ushort oblicz_crc(byte[] buffer, int length) 
{ 
    unchecked 
    { 
     ushort crc = 0xffff; 
     for (int i = 0; i < length; i++) 
     { 
      crc ^= buffer[i]; 
      for (int j = 0; j < 8; j++) 
      { 
       if ((crc & 0x0001) != 0) 
       { 
        crc >>= 1; 
        crc ^= 0xA001; 
       } 
       else 
       { 
        crc >>= 1; 
       } 
      } 
     } 
     return (crc); 
    } 
} 
3

問題は、この行である:

crc ^= (ushort)(BitConverter.ToUInt16(buffer, 0) + (byte)i); 

元のコードでは、その:

crc ^= *(buffer+i); 

元のコードは、バッファポインタiに添加し、その位置を間接参照しています。コードを次のように変更した場合:

crc ^= (ushort)(buffer[i]); 

実際には同じ操作を行っています。

+1

あなたの所見は有効ですが、元のコードは '*(buffer + i)'からUInt16を読み込んでいません。 'buffer'は単なる' uint8_t * 'です。したがって、この行の正しいコードは次のようになります: 'crc^=(ushort)buffer [i];' –

+1

@BenVoigt crcがushortの場合には私たちはあなたにキャストする必要はないと思います。 'crc^= buffer [i]'だけを使って警告します)。しかし、あなたが正しいです - この答えは間違っています。なぜなら 'バイト'を使うべきときには 'ushort'を使うからです。 –

+1

@BenVoigtそれを見つけてくれてありがとう。私は私の答えでそれを修正しました。 – theB