0

HEX 文字列から Kermit CRC 値を取得する関数に取り組んでいます。DELPHI にコードがあります。私は .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 ページからコードを取得しました: Kermit CRC in DELPHI

Delphi関数は正しいと思います。誰かがコードを C# に変換できれば、それは素晴らしいことです。C#に変換しようとしたのですが、WORDのデータ型とDelphiのLO関数で迷ってしまいました。皆さん、ありがとうございました。

4

2 に答える 2

2

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(string)を使用してa を に変換しstringますbyte[]

于 2010-05-09T16:49:56.647 に答える
0

ワードは 16 ビットの符号なし整数です (値 0..65535 を格納できます)。

Lo は整数の下位バイトを返します。たとえば、整数が 0x7B41AF の場合、lo は 0xAF を返します。

于 2010-05-09T16:50:50.417 に答える