Exemplo n.º 1
0
        private int DecodeToWaveR32(byte[] blockData)
        {
            var hcaInfo = HcaInfo;

            if (blockData == null)
            {
                throw new ArgumentNullException(nameof(blockData));
            }
            if (blockData.Length < hcaInfo.BlockSize)
            {
                throw new HcaException(ErrorMessages.GetInvalidParameter("blockData.Length"), ActionResult.InvalidParameter);
            }
            var checksum = HcaHelper.Checksum(blockData, 0);

            if (checksum != 0)
            {
                throw new HcaException(ErrorMessages.GetChecksumNotMatch(0, checksum), ActionResult.ChecksumNotMatch);
            }
            _cipher.Decrypt(blockData);
            var d     = new DataBits(blockData, hcaInfo.BlockSize);
            var magic = d.GetBit(16);

            if (magic != 0xffff)
            {
                throw new HcaException(ErrorMessages.GetMagicNotMatch(0xffff, magic), ActionResult.MagicNotMatch);
            }
            var a        = (d.GetBit(9) << 8) - d.GetBit(7);
            var channels = _channels;
            var ath      = _ath;

            try {
                for (var i = 0; i < hcaInfo.ChannelCount; ++i)
                {
                    channels[i].Decode1(d, hcaInfo.CompR09, a, ath.Table);
                }
                for (var i = 0; i < 8; ++i)
                {
                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        channels[j].Decode2(d);
                    }
                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        channels[j].Decode3(hcaInfo.CompR09, hcaInfo.CompR08, (uint)(hcaInfo.CompR07 + hcaInfo.CompR06), hcaInfo.CompR05);
                    }
                    for (var j = 0; j < hcaInfo.ChannelCount - 1; ++j)
                    {
                        Channel.Decode4(ref channels[j], ref channels[j + 1], i, (uint)(hcaInfo.CompR05 - hcaInfo.CompR06), hcaInfo.CompR06, hcaInfo.CompR07);
                    }
                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        channels[j].Decode5(i);
                    }
                }
                return(blockData.Length);
            } catch (IndexOutOfRangeException ex) {
                const string message = "Index access exception detected. It is probably because you are using an incorrect HCA key pair while decoding a type 56 HCA file.";
                throw new HcaException(message, ActionResult.DecodeFailed, ex);
            }
        }
Exemplo n.º 2
0
 public void Decode2(DataBits data)
 {
     for (uint i = 0; i < Count; ++i)
     {
         float f;
         int   s       = Scale[i];
         int   bitSize = ChannelTables.Decode2List1[s];
         int   v       = data.GetBit(bitSize);
         if (s < 8)
         {
             v += s << 4;
             data.AddBit(ChannelTables.Decode2List2[v] - bitSize);
             f = ChannelTables.Decode2List3[v];
         }
         else
         {
             v = (1 - ((v & 1) << 1)) * (v >> 1);
             if (v == 0)
             {
                 data.AddBit(-1);
             }
             f = v;
         }
         Block[i] = Base[i] * f;
     }
     for (var i = Count; i < Block.Length; ++i)
     {
         Block[i] = 0;
     }
 }
Exemplo n.º 3
0
        private bool ConvertBlock(byte[] blockData, Stream outputStream)
        {
            var checksum = HcaHelper.Checksum(blockData, 0);

            if (checksum != 0)
            {
                return(false);
            }
            _cipherFrom.Decrypt(blockData);
            var dataClass = new DataBits(blockData, (uint)blockData.Length);
            var magic     = dataClass.GetBit(16);

            if (magic != 0xffff)
            {
                return(false);
            }
            _cipherTo.Encrypt(blockData);
            FixDataBlock(blockData);
            outputStream.Write(blockData, 0, blockData.Length);
            return(true);
        }
Exemplo n.º 4
0
        public void Decode2(int channelIndex, DataBits data)
        {
            var pCount = GetPtrOfCount(channelIndex);
            var pScale = GetPtrOfScale(channelIndex);
            var pBlock = GetPtrOfBlock(channelIndex);
            var pBase  = GetPtrOfBase(channelIndex);

            for (var i = 0; i < *pCount; ++i)
            {
                int   s       = pScale[i];
                int   bitSize = ChannelTables.Decode2List1[s];
                var   v       = data.GetBit(bitSize);
                float f;

                if (s < 8)
                {
                    v += s << 4;
                    data.AddBit(ChannelTables.Decode2List2[v] - bitSize);
                    f = ChannelTables.Decode2List3[v];
                }
                else
                {
                    v = (1 - ((v & 1) << 1)) * (v >> 1);

                    if (v == 0)
                    {
                        data.AddBit(-1);
                    }

                    f = v;
                }

                pBlock[i] = pBase[i] * f;
            }

            ZeroMemory(&pBlock[*pCount], sizeof(float) * (int)(0x80 - *pCount));
        }
Exemplo n.º 5
0
        public void Decode1(int channelIndex, DataBits data, uint a, int b, byte[] ath)
        {
            var v      = data.GetBit(3);
            var pCount = GetPtrOfCount(channelIndex);
            var pValue = GetPtrOfValue(channelIndex);

            if (v >= 6)
            {
                for (var i = 0; i < *pCount; ++i)
                {
                    pValue[i] = (sbyte)data.GetBit(6);
                }
            }
            else if (v != 0)
            {
                var v1 = data.GetBit(6);
                var v2 = (1 << v) - 1;
                var v3 = v2 >> 1;

                pValue[0] = (sbyte)v1;

                for (var i = 1; i < *pCount; ++i)
                {
                    var v4 = data.GetBit(v);

                    if (v4 != v2)
                    {
                        v1 += v4 - v3;
                    }
                    else
                    {
                        v1 = data.GetBit(6);
                    }

                    pValue[i] = (sbyte)v1;
                }
            }
            else
            {
                ZeroMemory(pValue, 0x80);
            }

            var pType    = GetPtrOfType(channelIndex);
            var pValue2  = GetPtrOfValue2(channelIndex);
            var ppValue3 = GetPtrOfValue3(channelIndex);

            if (*pType == 2)
            {
                v          = data.CheckBit(4);
                pValue2[0] = (sbyte)v;

                if (v < 15)
                {
                    for (var i = 0; i < 8; ++i)
                    {
                        pValue2[i] = (sbyte)data.GetBit(4);
                    }
                }
            }
            else
            {
                for (var i = 0; i < a; ++i)
                {
                    (*ppValue3)[i] = (sbyte)data.GetBit(6);
                }
            }

            var pScale = GetPtrOfScale(channelIndex);

            for (var i = 0; i < *pCount; ++i)
            {
                v = pValue[i];

                if (v != 0)
                {
                    v = ath[i] + ((b + i) >> 8) - ((v * 5) >> 1) + 1;

                    if (v < 0)
                    {
                        v = 15;
                    }
                    else if (v >= 0x39)
                    {
                        v = 1;
                    }
                    else
                    {
                        v = ChannelTables.Decode1ScaleList[v];
                    }
                }

                pScale[i] = (sbyte)v;
            }

            ZeroMemory(&pScale[*pCount], (int)(0x80 - *pCount));

            var pBase = GetPtrOfBase(channelIndex);

            for (var i = 0; i < *pCount; ++i)
            {
                pBase[i] = ChannelTables.Decode1ValueSingle[pValue[i]] * ChannelTables.Decode1ScaleSingle[pScale[i]];
            }
        }
Exemplo n.º 6
0
        public void Decode1(DataBits data, uint a, int b, byte[] ath)
        {
            int v = data.GetBit(3);

            if (v >= 6)
            {
                for (uint i = 0; i < Count; ++i)
                {
                    Value[i] = (byte)data.GetBit(6);
                }
            }
            else if (v != 0)
            {
                int v1 = data.GetBit(6);
                int v2 = (1 << v) - 1;
                int v3 = v2 >> 1;
                Value[0] = (byte)v1;
                for (uint i = 1; i < Count; ++i)
                {
                    int v4 = data.GetBit(v);
                    if (v4 != v2)
                    {
                        v1 += v4 - v3;
                    }
                    else
                    {
                        v1 = data.GetBit(6);
                    }
                    Value[i] = (byte)v1;
                }
            }
            else
            {
                Value.ZeroMem();
            }
            if (Type == 2)
            {
                v         = data.CheckBit(4);
                Value2[0] = (byte)v;
                if (v < 15)
                {
                    for (var i = 0; i < 8; ++i)
                    {
                        Value2[i] = (byte)data.GetBit(4);
                    }
                }
            }
            else
            {
                for (uint i = 0; i < a; ++i)
                {
                    //Value3[i] = (byte)data.GetBit(6);
                    SetValue3(i, (byte)data.GetBit(6));
                }
            }
            for (uint i = 0; i < Count; ++i)
            {
                v = Value[i];
                if (v != 0)
                {
                    v = (int)(ath[i] + ((b + i) >> 8) - ((v * 5) >> 1) + 1);
                    if (v < 0)
                    {
                        v = 15;
                    }
                    else if (v >= 0x39)
                    {
                        v = 1;
                    }
                    else
                    {
                        v = ChannelTables.Decode1ScaleList[v];
                    }
                }
                Scale[i] = (byte)v;
            }
            for (var i = Count; i < Scale.Length; ++i)
            {
                Scale[i] = 0;
            }
            for (uint i = 0; i < Count; ++i)
            {
                Base[i] = ChannelTables.Decode1ValueSingle[Value[i]] * ChannelTables.Decode1ScaleSingle[Scale[i]];
            }
        }
Exemplo n.º 7
0
        private int DecodeToWaveR32(byte[] blockData, int blockIndex)
        {
            var hcaInfo = HcaInfo;

            if (blockData == null)
            {
                throw new ArgumentNullException(nameof(blockData));
            }
            if (blockData.Length < hcaInfo.BlockSize)
            {
                throw new HcaException(ErrorMessages.GetInvalidParameter(nameof(blockData) + "." + nameof(blockData.Length)), ActionResult.InvalidParameter);
            }
            var checksum = HcaHelper.Checksum(blockData, 0);

            if (checksum != 0)
            {
                throw new HcaException(ErrorMessages.GetChecksumNotMatch(0, checksum), ActionResult.ChecksumNotMatch);
            }
            _cipher.Decrypt(blockData);
            var d     = new DataBits(blockData, hcaInfo.BlockSize);
            var magic = d.GetBit(16);

            if (magic != 0xffff)
            {
                throw new HcaException(ErrorMessages.GetMagicNotMatch(0xffff, magic), ActionResult.MagicNotMatch);
            }
            var    a        = (d.GetBit(9) << 8) - d.GetBit(7);
            var    channels = _channels;
            var    ath      = _ath;
            string site     = null;

            try {
                int i;

                for (i = 0; i < hcaInfo.ChannelCount; ++i)
                {
                    site = $"Decode1({i.ToString()})";
                    channels.Decode1(i, d, hcaInfo.CompR09, a, ath.Table);
                }

                for (i = 0; i < 8; ++i)
                {
                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        site = $"Decode2({i.ToString()}/{j.ToString()})";
                        channels.Decode2(j, d);
                    }

                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        site = $"Decode3({i.ToString()}/{j.ToString()})";
                        channels.Decode3(j, hcaInfo.CompR09, hcaInfo.CompR08, (uint)(hcaInfo.CompR07 + hcaInfo.CompR06), hcaInfo.CompR05);
                    }

                    for (var j = 0; j < hcaInfo.ChannelCount - 1; ++j)
                    {
                        site = $"Decode4({i.ToString()}/{j.ToString()})";
                        channels.Decode4(j, j + 1, i, (uint)(hcaInfo.CompR05 - hcaInfo.CompR06), hcaInfo.CompR06, hcaInfo.CompR07);
                    }

                    for (var j = 0; j < hcaInfo.ChannelCount; ++j)
                    {
                        site = $"Decode5({i.ToString()}/{j.ToString()})";
                        channels.Decode5(j, i);
                    }
                }

                return(blockData.Length);
            } catch (IndexOutOfRangeException ex) {
                const string message  = "Index access exception detected. It is probably because you are using an incorrect HCA key pair while decoding a type 56 HCA file.";
                var          siteInfo = $"Site: {site} @ block {blockIndex.ToString()}";
                var          err      = message + Environment.NewLine + siteInfo;
                throw new HcaException(err, ActionResult.DecodeFailed, ex);
            }
        }