Beispiel #1
0
            /// <summary>
            /// #private Generate the metadata required to internally manipulate a string
            /// </summary>
            private StringMeta GetMeta(PrelenStringParams p, List <byte> source)
            {
                StringMeta meta;

                meta.String       = Encoding.GetString(source.ToArray());
                meta.StringLength = (uint)meta.String.Length;

                meta.StringSize = (uint)source.Count;

                // Add nul-terminator size to read string size
                if (p.length == Length.lNul)
                {
                    switch (p.size)
                    {
                    case Size.s8:
                        meta.StringSize += sizeof(byte);
                        break;

                    case Size.s16:
                        meta.StringSize += sizeof(short);
                        break;
                    }
                }

                return(meta);
            }
Beispiel #2
0
            /// <summary>
            /// Calculate the actual length of a string, given the encoding and metadata
            /// </summary>
            public int StringLength(PrelenStringParams p, string source_string)
            {
                int len = Encoding.GetByteCount(source_string);

                if (p.length == Length.lNul)
                {
                    len += 1;
                }

                // TODO: alignment

                return(len);
            }
Beispiel #3
0
            /// <summary>
            /// #private Extract a string using a specific set of parameters
            /// </summary>
            private StringMeta Read(PrelenStringParams p)
            {
                var raw = new List <byte>();

                switch (p.size)
                {
                case Size.s8:
                {
                    if (p.length == Length.lNul)
                    {
                        for (byte val = br.u8(); val != 0; val = br.u8())
                        {
                            raw.Add(val);
                        }
                    }
                    else
                    {
                        uint len = 0;

                        if (p.length == Length.lFixed)
                        {
                            len = p.read;
                        }
                        else
                        {
                            switch (p.length)
                            {
                            case Length.l8:
                            {
                                len = br.u8();
                                break;
                            }

                            case Length.l16:
                            {
                                len = br.u16();
                                break;
                            }

                            case Length.l32:
                            {
                                len = br.u32();
                                break;
                            }
                            }
                        }

                        raw = br.u8(len).ToList();
                    }
                }
                break;

                case Size.s16:
                {
                    if (p.length == Length.lNul)
                    {
                        for (ushort val = br.u16(); val != 0; val = br.u16())
                        {
                            ToByteList(raw, val);
                        }
                    }
                    else
                    {
                        uint len = 0;

                        if (p.length == Length.lFixed)
                        {
                            len = p.read;
                        }
                        else
                        {
                            switch (p.length)
                            {
                            case Length.l8:
                            {
                                len = br.u8();
                                break;
                            }

                            case Length.l16:
                            {
                                len = br.u16();
                                break;
                            }

                            case Length.l32:
                            {
                                len = br.u32();
                                break;
                            }
                            }
                        }

                        var val = br.u16(len);
                        ToByteList(raw, val);
                    }
                }
                break;
                }

                return(GetMeta(p, raw));
            }
Beispiel #4
0
 /// <summary>
 /// Read a string using a specific set of parameters
 /// </summary>
 public StringMeta pl(PrelenStringParams param)
 {
     return(Read(param));
 }
Beispiel #5
0
 /// <summary>
 /// Read a string using a specific set of parameters
 /// </summary>
 public StringMeta pl(PrelenStringParams param)
 {
     return(StrReader.pl(param));
 }