私は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:この質問は私の特定のコードスニペットです。私が答えを得るとき、それを削除するのが最善でしょうか?または私はそれを残す必要がありますか?
他の人にも便益が出るようにしておいてください – torox