VAGSuite.EDC15P_checksum.tdi41_2002_checksum_calculate C# (CSharp) Метод

tdi41_2002_checksum_calculate() приватный Метод

private tdi41_2002_checksum_calculate ( byte file_buffer, UInt32 chk_start_addr, UInt32 chk_end_addr, UInt16 seed_a, UInt16 seed_b, UInt16 seed_c, UInt16 seed_d, bool first_pass ) : UInt32
file_buffer byte
chk_start_addr System.UInt32
chk_end_addr System.UInt32
seed_a System.UInt16
seed_b System.UInt16
seed_c System.UInt16
seed_d System.UInt16
first_pass bool
Результат System.UInt32
        UInt32 tdi41_2002_checksum_calculate(byte[] file_buffer, UInt32 chk_start_addr, UInt32 chk_end_addr, UInt16 seed_a, UInt16 seed_b, UInt16 seed_c, UInt16 seed_d, bool first_pass)
        {
            UInt32 count = chk_start_addr / 2;
            UInt32 end_count = chk_end_addr / 2;
            UInt32 buffer_addr = chk_start_addr;
            UInt32 checksum, var_6, var_7 = 0;

            UInt16 var_1 = 0, var_2 = 0, var_3, var_4, var_5;

            if (count != end_count)
            {
                var_1 = seed_a;
                var_2 = seed_b;

                if (chk_start_addr == 0x8000)
                {
                    var_1 = Convert.ToUInt16(var_1 ^ 0xD565);
                    var_2 += 0x308a;
                }

                do
                {
                    var_1 ^= Convert.ToUInt16(((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]);
                    var_3 = Convert.ToUInt16(var_2 & 0xf);
                    ++count;
                    buffer_addr += 2;
                    var_4 = 0;

                    if ((var_2 & 0xf) > 0)
                    {
                        do
                        {
                            var_4 = (UInt16)(var_1 >> 15);
                            var_1 = (UInt16)(((var_1 * 2) + var_4));

                            --var_3;
                        } while (var_3 > 0);
                    }

                    var_2 -= (UInt16)((var_4 + ((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]));
                    var_2 = (UInt16)(var_1 ^ var_2);

                    buffer_addr += 2;
                    ++count;

                    if (count > end_count)
                        break;

                    var_5 = (UInt16)(((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]);
                    buffer_addr += 4;
                    var_1 += (UInt16)((0xffff - var_5 + 0xdaad));
                    var_6 = (UInt32)((UInt16)file_buffer[buffer_addr - 1] << 8);
                    var_2 ^= (UInt16)((UInt16)var_6 + (UInt16)file_buffer[buffer_addr - 2]);
                    var_4 = (UInt16)(var_1 & 0xf);
                    count += 2;

                    if ((var_1 & 0xf) > 0)
                    {
                        do
                        {
                            var_6 = (var_6 | 0xffff) & var_2;
                            var_6 <<= 15;
                            var_2 = (UInt16)(((var_2 >> 1) + var_6));

                            --var_4;
                        } while (var_4 > 0);
                    }
                } while (count <= end_count);
            }

            if (chk_start_addr == 0)
            {
                var_1 -= 0x79cf;
                var_2 -= 0x1033;
            }

            if (!first_pass)
            {
                var_5 = seed_d;
                var_1 -= seed_c;
                var_6 = (UInt16)((seed_c | 0xffff) & 0xdaad);
                var_1 += (UInt16)(var_6 - 1);
                var_7 = var_7 & 0xffff;

                for (count = (UInt32)(seed_c & 0xf); count > 0; var_5 = (UInt16)((((UInt32)var_5 >> 15) + var_7)))
                {
                    --count;
                    var_7 = (var_7 | 0xffff) & var_5;
                    var_7 *= 2;
                }

                checksum = (UInt32)(((UInt32)var_1 + (((UInt32)var_5 ^ (UInt32)var_2) << 16)));
            }
            else
            {
                checksum = (UInt32)(((UInt32)var_1 + ((UInt32)var_2 << 16)));
            }

            return (checksum);
        }