HexToArray() static private method

static private HexToArray ( string input ) : byte[]
input string
return byte[]
Example #1
0
        private static bool CheckBinPart(ref byte[] data, string name)
        {
            GC.Collect();
            var datareversed = false;
            var checkdata    = Common.Types[data.Length].Bincheck.Value[name];

            if (checkdata.Value.Offset >= data.Length)
            {
                Logger.WriteLine2("FAILED! Faulty configuration (Bad Offset)!");
                return(false);
            }
            var expmsg = string.Format("{0}{1}Offset: 0x{2:X}{1}", checkdata.Value.Description, Environment.NewLine, checkdata.Value.Offset);
            var length = 0;

            foreach (var d in checkdata.Value.ExpectedList.Value)
            {
                var count  = 0;
                var tmpmsg = Common.GetDataReadable(d.Expected, ref count);
                if (length == 0)
                {
                    length = count;
                }
                if (count != length || (length % 2) != 0)
                {
                    expmsg += string.Format("{0}ERROR: Bad length of the following data!:", Environment.NewLine);
                }
                expmsg += string.Format("{0}{1}", tmpmsg.Trim(), Environment.NewLine);
                if (checkdata.Value.Asciiout)
                {
                    expmsg += string.Format("{0}Ascii Value: {1}", Environment.NewLine, Encoding.ASCII.GetString(Common.HexToArray(d.Expected)));
                }
            }
            if (expmsg.Contains("ERROR"))
            {
                Logger.WriteLine2("FAILED! Faulty configuration!");
                return(false);
            }
            var tmp = new byte[length / 2];

            if (checkdata.Value.Offset >= data.Length + tmp.Length)
            {
                Logger.WriteLine2("FAILED! Faulty configuration (Bad Offset/Data length)!");
                return(false);
            }
            Buffer.BlockCopy(data, (int)checkdata.Value.Offset, tmp, 0, tmp.Length);
            var msg  = Common.GetDataForTest(tmp);
            var isok = false;

            foreach (var d in checkdata.Value.ExpectedList.Value)
            {
                isok = msg.Equals(d.Expected, StringComparison.CurrentCultureIgnoreCase);
                if (!isok)
                {
                    continue;
                }
                break;
            }
            if (!isok)
            {
                if (tmp.Length == 1)
                {
                    if ((checkdata.Value.Offset % 2) == 0)
                    {
                        if (data.Length < checkdata.Value.Offset + 1)
                        {
                            Logger.WriteLine2("FAILED! Offset is at end of image!");
                            return(false);
                        }
                        tmp[0] = data[checkdata.Value.Offset + 1];
                    }
                    else
                    {
                        tmp[0] = data[checkdata.Value.Offset - 1];
                    }
                    msg = tmp[0].ToString("X2");
                }
                else if (Common.SwapBytes(ref tmp))
                {
                    msg = Common.GetDataForTest(tmp);
                }
                foreach (var d in checkdata.Value.ExpectedList.Value)
                {
                    isok = msg.Equals(d.Expected, StringComparison.CurrentCultureIgnoreCase);
                    if (!isok)
                    {
                        continue;
                    }
                    datareversed = true;
                    break;
                }
            }
            Buffer.BlockCopy(data, (int)checkdata.Value.Offset, tmp, 0, tmp.Length);
            msg = Common.GetDataReadable(tmp);
            if (datareversed)
            {
                Common.SwapBytes(ref tmp);
                msg += string.Format("{0}Reversed (checked) data:{0}{1}", Environment.NewLine, Common.GetDataReadable(tmp));
            }
            if (checkdata.Value.Asciiout)
            {
                var asciidata = Encoding.ASCII.GetString(tmp);
                msg += string.Format("{0}Ascii Value: {1}", Environment.NewLine, asciidata);
            }
            AddItem(new Common.PartsObject
            {
                Name           = name.Trim(),
                ActualString   = msg.Trim(),
                ExpectedString = expmsg,
                Result         = isok,
            });
            Logger.WriteLine2(isok ? "OK!" : string.Format("FAILED! {0}{1}Actual data: {2}", expmsg, Environment.NewLine, msg));
            return(isok);
        }
Example #2
0
        public void ParseConfig(string file)
        {
            Common.SendStatus(string.Format("Parsing {0}", file));
            Common.Types.Clear();
            using (var xml = XmlReader.Create(file)) {
                var  dataCheckKey = 0;
                var  dataCheckOk  = false;
                var  skUkey       = 0;
                long size         = 0;
                var  skuWarn      = false;
                var  skuName      = "";
                var  skuWarnMsg   = "";
                var  skuMinVer    = "";
                while (xml.Read())
                {
                    if (!xml.IsStartElement())
                    {
                        continue;
                    }
                    switch (xml.Name.ToLower())
                    {
                    case "type":
                        if (long.TryParse(xml["size"], out size))
                        {
                            if (!Common.Types.ContainsKey(size))
                            {
                                Common.Types.Add(size, new Common.TypeData());
                            }
                            Common.Types[size].Name.Value = xml["name"];
                        }
                        break;

                        #region Statistics part

                    case "stats":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        xml.Read();
                        Common.Types[size].StatDescription.Value = xml.Value;
                        if (!string.IsNullOrEmpty(Common.Types[size].StatDescription.Value))
                        {
                            Common.Types[size].StatDescription.Value  = Common.Types[size].StatDescription.Value.Trim();
                            Common.Types[size].StatDescription.Value += Environment.NewLine;
                            Common.Types[size].StatDescription.Value.Replace("\\n", Environment.NewLine);
                        }
                        break;

                    case "statspart":
                        var key = xml["key"];
                        if (key == null)
                        {
                            break;
                        }
                        if (string.IsNullOrEmpty(key))
                        {
                            key = "*";
                        }
                        key = key.ToUpper();
                        if (!Common.Types[size].Statlist.Value.ContainsKey(key))
                        {
                            double low;
                            double high;
                            var    lowtxt = xml["low"];
                            if (lowtxt != null)
                            {
                                lowtxt = Regex.Replace(lowtxt, @"\s+", "");
                                lowtxt = lowtxt.Replace('.', ',');
                            }
                            var hightxt = xml["high"];
                            if (hightxt != null)
                            {
                                hightxt = Regex.Replace(hightxt, @"\s+", "");
                                hightxt = hightxt.Replace('.', ',');
                            }
                            if (!double.TryParse(lowtxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out low))
                            {
                                low = 0;
                            }
                            else if (low < 0 || low > 100)
                            {
                                low = 0;
                            }
                            if (!double.TryParse(hightxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out high))
                            {
                                high = 100;
                            }
                            else if (high > 100 || low > high || high < 0)
                            {
                                high = 100;
                            }
                            Common.Types[size].Statlist.Value.Add(key, new Holder <Common.StatCheck>(new Common.StatCheck(low, high)));
                        }
                        break;

                        #endregion Statistics part

                        #region Binary Check Entry

                    case "binentry":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        key = xml["name"];
                        if (String.IsNullOrEmpty(key))
                        {
                            break;
                        }
                        if (!Common.Types[size].Bincheck.Value.ContainsKey(key))
                        {
                            if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase))
                            {
                                Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(new List <Common.MultiBin>(), true, xml["offset"], xml["description"], xml["ascii"])));
                                var id = xml["id"];
                                xml.Read();
                                Common.Types[size].Bincheck.Value[key].Value.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id));
                            }
                            else
                            {
                                var offset      = xml["offset"];
                                var description = xml["description"];
                                var ascii       = xml["ascii"];
                                xml.Read();
                                Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(null, false, offset, description, ascii, xml.Value)));
                            }
                        }
                        else if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase))
                        {
                            var id           = xml["id"];
                            var disablepatch = !string.IsNullOrEmpty(xml["disablepatch"]) && xml["disablepatch"].Equals("true", StringComparison.CurrentCultureIgnoreCase);
                            xml.Read();
                            var explist = Common.Types[size].Bincheck.Value[key].Value;
                            explist.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id, disablepatch));
                        }
                        break;

                        #endregion Binary Check Entry

                        #region Data Check list

                    case "datalist":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var dataCheckList = new Common.DataCheck {
                            Name          = xml["name"],
                            ThresholdList = new Dictionary <string, double>()
                        };
                        if (long.TryParse(xml["offset"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Offset))
                        {
                            dataCheckOk = long.TryParse(xml["size"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Size);
                            if (!dataCheckOk)
                            {
                                dataCheckOk = long.TryParse(xml["ldrsize"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.LdrSize);
                            }
                            if (dataCheckOk)
                            {
                                dataCheckKey++;
                                dataCheckList.DataKey = dataCheckKey;
                                Common.Types[size].DataCheckList.Value.Add(dataCheckList);
                            }
                        }
                        break;

                        #region Data treshold

                    case "datatreshold":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        if (!dataCheckOk)
                        {
                            break;
                        }
                        foreach (var entry in Common.Types[size].DataCheckList.Value)
                        {
                            if (entry.DataKey != dataCheckKey)
                            {
                                continue;
                            }
                            var dkey = xml["key"];
                            if (dkey == null)
                            {
                                break;
                            }
                            if (string.IsNullOrEmpty(dkey))
                            {
                                dkey = "*";
                            }
                            dkey = dkey.ToUpper();
                            xml.Read();
                            var tmptxt = xml.Value;
                            if (tmptxt != null)
                            {
                                tmptxt = Regex.Replace(tmptxt, @"\s+", "");
                                tmptxt = tmptxt.Replace('.', ',');
                            }
                            double tmpval;
                            if (!double.TryParse(tmptxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out tmpval))
                            {
                                tmpval = 49;
                            }
                            else if (tmpval < 0 || tmpval > 100)
                            {
                                tmpval = 49;
                            }
                            entry.ThresholdList.Add(dkey, tmpval);
                            break;
                        }
                        break;

                        #endregion Data treshold

                        #endregion Data Check List

                        #region SKU Data List

                    case "skudataentry":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var skuDataEntry = new Common.SKUDataEntry();
                        var skuoffset    = xml["offset"];
                        var isok         = (uint.TryParse(skuoffset, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Offset));
                        if (isok)
                        {
                            var skusize = xml["size"];
                            isok = (uint.TryParse(skusize, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Size));
                        }
                        xml.Read();
                        skuDataEntry.Type = xml.Value;
                        if (isok)
                        {
                            Common.Types[size].SKUDataList.Value.Add(skuDataEntry);
                        }
                        break;

                        #endregion SKU Data List

                        #region SKU List

                    case "skulist":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        skUkey++;
                        skuWarn    = xml["warn"] != null && xml["warn"].Equals("true", StringComparison.CurrentCultureIgnoreCase);
                        skuName    = xml["name"];
                        skuWarnMsg = xml["warnmsg"];
                        skuMinVer  = xml["minver"];
                        break;

                    case "skuentry":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var exists = false;
                        foreach (var entry in Common.Types[size].SKUList.Value)
                        {
                            if (entry.SKUKey != skUkey)
                            {
                                continue;
                            }
                            exists = true;
                            break;
                        }
                        var skuEntry = new Common.SKUEntry();
                        if (!exists)
                        {
                            skuEntry.Warn    = skuWarn;
                            skuEntry.WarnMsg = skuWarnMsg;
                        }
                        skuEntry.SKUKey = skUkey;
                        skuEntry.Name   = skuName;
                        skuEntry.Type   = xml["type"];
                        skuEntry.MinVer = skuMinVer;
                        xml.Read();
                        skuEntry.Data = Regex.Replace(xml.Value, @"\s+", "");
                        Common.Types[size].SKUList.Value.Add(skuEntry);
                        break;

                        #endregion SKU List

                        #region RepCheck Entry

                    case "repcheck":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var tmp = new Common.RepCheckData {
                            Name = xml["name"]
                        };
                        if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmp.Offset))
                        {
                            break;     // It's broken!
                        }
                        xml.Read();
                        if (!string.IsNullOrEmpty(xml.Value))
                        {
                            var data = Encoding.Unicode.GetString(Common.HexToArray(Regex.Replace(xml.Value, @"\s+", "").ToUpper()));
                            Common.Types[size].RepCheck.Value.Add(data, new Holder <Common.RepCheckData>(tmp));
                        }
                        break;

                        #endregion

                        #region Datamatches Entries

                    case "datamatchid":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var tmpid = xml["id"];
                        if (string.IsNullOrEmpty(tmpid))
                        {
                            break;
                        }
                        if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid))
                        {
                            Common.Types[size].DataMatchList.Value.Add(tmpid, new Holder <Common.DataMatchID>(new Common.DataMatchID()));
                        }
                        xml.Read();
                        if (string.IsNullOrEmpty(xml.Value))
                        {
                            break;
                        }
                        Common.Types[size].DataMatchList.Value[tmpid].Value.Name = xml.Value;
                        break;

                    case "datamatch":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var tmpid2 = xml["id"];
                        if (string.IsNullOrEmpty(tmpid2))
                        {
                            break;
                        }
                        if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid2))
                        {
                            break;
                        }
                        var tmpmatch = new Common.DataMatch();
                        if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmpmatch.Offset))
                        {
                            break;
                        }
                        if (!int.TryParse(xml["length"], NumberStyles.HexNumber, null, out tmpmatch.Length))
                        {
                            break;
                        }
                        if (!int.TryParse(xml["seqrep"], NumberStyles.HexNumber, null, out tmpmatch.SequenceRepetitions))
                        {
                            tmpmatch.SequenceRepetitions = 0;
                        }
                        tmpmatch.DisableDisplay = !string.IsNullOrEmpty(xml["nodisp"]) && xml["nodisp"].Equals("true", StringComparison.CurrentCultureIgnoreCase);                            xml.Read();
                        if (string.IsNullOrEmpty(xml.Value))
                        {
                            break;
                        }
                        tmpmatch.Name = xml.Value;
                        Common.Types[size].DataMatchList.Value[tmpid2].Value.Data.Add(tmpmatch);
                        break;

                        #endregion

                        #region Datafill Entry

                    case "datafill":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        var datafill = new Common.DataFillEntry
                        {
                            Name = xml["name"]
                        };
                        int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out datafill.Offset);
                        int.TryParse(xml["size"], NumberStyles.HexNumber, null, out datafill.Length);
                        int.TryParse(xml["sizefrom"], NumberStyles.HexNumber, null, out datafill.Sizefrom);
                        int.TryParse(xml["ldrsize"], NumberStyles.HexNumber, null, out datafill.LdrSize);
                        int.TryParse(xml["regionsize"], NumberStyles.HexNumber, null, out datafill.RegionSize);
                        int.TryParse(xml["regionstart"], NumberStyles.HexNumber, null, out datafill.RegionStart);
                        int.TryParse(xml["vtrmentrycount_offset"], NumberStyles.HexNumber, null, out datafill.vtrmentrycount_offset);
                        xml.Read();
                        if (!byte.TryParse(xml.Value, NumberStyles.HexNumber, null, out datafill.Data))
                        {
                            break;
                        }
                        Common.Types[size].DataFillEntries.Value.Add(datafill);
                        break;

                        #endregion

                        #region ROS#Offset

                    case "ros0offset":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        xml.Read();
                        if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS0Offset))
                        {
                            Common.Types[size].ROS0Offset = -1;
                        }
                        break;

                    case "ros1offset":
                        if (!Common.Types.ContainsKey(size))
                        {
                            break;
                        }
                        xml.Read();
                        if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS1Offset))
                        {
                            Common.Types[size].ROS1Offset = -1;
                        }
                        break;

                        #endregion
                    }
                }
            }
            Common.SendStatus("Parsing done!");
            checkbtn.Enabled = true;
        }
Example #3
0
        private static bool CheckBinPart(ref byte[] data, string name, ref bool reversed)
        {
            GC.Collect();
            var datareversed = false;
            var checkdata    = Common.Types[data.Length].Bincheck.Value[name];

            if (checkdata.Value.Offset >= data.Length)
            {
                Logger.WriteLine2("FAILED! Faulty configuration (Bad Offset)!");
                return(false);
            }
            var expmsg = string.Format("{0}{1}Offset: 0x{2:X}{1}", checkdata.Value.Description, Environment.NewLine, checkdata.Value.Offset);

            if (!string.IsNullOrEmpty(checkdata.Value.Expected))
            {
                if ((checkdata.Value.Expected.Length % 2) != 0)
                {
                    Logger.WriteLine2("FAILED! Nothing to check! (a.k.a Faulty configuration!)");
                    return(false);
                }
                expmsg += string.Format("Expected data:{0}", Environment.NewLine);
                expmsg += Common.GetDataReadable(checkdata.Value.Expected).Trim();
                if (checkdata.Value.Asciiout)
                {
                    expmsg += string.Format("{0}Ascii Value: {1}", Environment.NewLine, Encoding.ASCII.GetString(Common.HexToArray(checkdata.Value.Expected)));
                }
            }
            else
            {
                Logger.WriteLine2("FAILED! Faulty configuration!");
                return(false);
            }
            var tmp = new byte[checkdata.Value.Expected.Length / 2];

            if (checkdata.Value.Offset >= data.Length + tmp.Length)
            {
                Logger.WriteLine2("FAILED! Faulty configuration (Bad Offset/Data length)!");
                return(false);
            }
            Buffer.BlockCopy(data, (int)checkdata.Value.Offset, tmp, 0, tmp.Length);
            var msg  = Common.GetDataForTest(tmp);
            var isok = msg.Equals(checkdata.Value.Expected, StringComparison.CurrentCultureIgnoreCase);

            if (!isok)
            {
                if (Common.SwapBytes(ref tmp))
                {
                    var swapped = Common.GetDataForTest(tmp);
                    isok = swapped.Equals(checkdata.Value.Expected, StringComparison.CurrentCultureIgnoreCase);
                    if (isok)
                    {
                        reversed     = true;
                        datareversed = true;
                    }
                }
            }
            Buffer.BlockCopy(data, (int)checkdata.Value.Offset, tmp, 0, tmp.Length);
            msg = Common.GetDataReadable(tmp);
            if (datareversed)
            {
                Common.SwapBytes(ref tmp);
                msg += string.Format("{0}Reversed (checked) data:{0}{1}", Environment.NewLine, Common.GetDataReadable(tmp));
            }
            if (checkdata.Value.Asciiout)
            {
                msg += string.Format("{0}Ascii Value: {1}", Environment.NewLine, Encoding.ASCII.GetString(tmp));
            }
            AddItem(new Common.PartsObject
            {
                Name           = name.Trim(),
                ActualString   = msg.Trim(),
                ExpectedString = expmsg,
                Result         = isok
            });
            Logger.WriteLine2(isok ? "OK!" : string.Format("FAILED! {0}{1}Actual data: {2}", expmsg, Environment.NewLine, msg));
            return(isok);
        }