/// <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); }
/// <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); }
/// <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)); }
/// <summary> /// Read a string using a specific set of parameters /// </summary> public StringMeta pl(PrelenStringParams param) { return(Read(param)); }
/// <summary> /// Read a string using a specific set of parameters /// </summary> public StringMeta pl(PrelenStringParams param) { return(StrReader.pl(param)); }