質問

私は、16進ストリングからカーミットCRC値を提供する関数に取り組んでいます。私はデルファイにコードを持っています。私は.NET開発者であり、C#のコードが必要です。

function CRC_16(cadena : string):word; 
var 
valuehex : word; 
i: integer; 
CRC : word; 
Begin 
   CRC := 0; 
   for i := 1 to length(cadena) do 
   begin 
      valuehex := ((ord(cadena[i]) XOR CRC) AND $0F) * $1081; 
      CRC := CRC SHR 4; 
      CRC := CRC XOR valuehex; 
      valuehex := (((ord(cadena[i]) SHR 4) XOR LO(CRC)) AND $0F); 
      CRC := CRC SHR 4; 
      CRC := CRC XOR (valuehex * $1081); 
   end; 
  CRC_16 := (LO(CRC) SHL 8) OR HI(CRC); 
end;

このWebページからコードを取得しました: デルフィのカーミットCRC

Delphi機能は正しいと思います。誰かがコードをC#に変換してください。私はC#に変換しようとしましたが、単語のデータ型とDelphiのLO関数で迷子になりました。皆さん、ありがとうございました。

役に立ちましたか?

解決

から MSDNフォーラム:

static long ComputeCRC(byte[] val)
{
    long crc;
    long q;
    byte c;
    crc = 0;
    for (int i = 0; i < val.Length; i++)
    {
        c = val[i];
        q = (crc ^ c) & 0x0f;
        crc = (crc >> 4) ^ (q * 0x1081);
        q = (crc ^ (c >> 4)) & 0xf;
        crc = (crc >> 4) ^ (q * 0x1081);
    }
    return (byte)crc << 8 | (byte)(crc >> 8);
}

使用する encoding.ascii.getBytes(文字列) aを変換する stringbyte[].

他のヒント

単語は、16ビットの符号なし整数です(値0..65535を保存できます)。

LOは、整数の低次バイトを返します。したがって、整数が0x7b41afの場合、たとえば、LOは0xafを返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top