LoginSignup
0
0

C# チェックサム計算 CRC , LRC

Last updated at Posted at 2024-02-06

modbusなどに用いられるチェックサムを計算する関数を用意したのでこちらに置いておきます。

CalcCRC.cs

        /// <summary>
        /// CRCを付加したいbyte列を第一引数に、第2引数の2byteに付加すべきCRC値を返します。[0]=下位[1]=上位(電文として送る時は下位から)
        /// </summary>
        /// <param name="message"></param>
        /// <param name="CRC"></param>
        public static void CalcCRC(List<byte> message, ref byte[] CRC)
        {
            ushort CRCFull = 0xFFFF;
            byte CRCHigh = 0xFF, CRCLow = 0xFF;
            char CRCLSB;

            foreach (byte i in message)
            {
                CRCFull = (ushort)(CRCFull ^ i);

                for (int j = 0; j < 8; j++)
                {
                    CRCLSB = (char)(CRCFull & 0x0001);
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);

                    if (CRCLSB == 1)
                        CRCFull = (ushort)(CRCFull ^ 0xA001);
                }
            }
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
        }
CalcLRC.cs

 /// <summary>
        /// LRCを計算します。先頭のヘッダ(:)をのぞいた伝文をbyteで渡してください。
        /// binaryで計算していたものを放り込んでもOK(binaryではヘッダがないため)
        /// </summary>
        /// <param name="packet"></param>
        /// <returns></returns>
        private string GetLRC(byte[] packet)
        {
            int checksum = 0;

            foreach (int c in packet)
            {
                checksum += c;
            }

            checksum = ~checksum;
            checksum = checksum + 1;
            checksum = checksum & 0xFF;

            string result = string.Format("{0,2:X}", checksum);

            return result;
        }

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0