public static bool UnpackString(ReadBuffer rb, ref string value) { byte t = rb.MoveNext(); if (t == 0xc0) { value = null; return(true); } if (t > 0x9f && t < 0xc0) { int slen = t & 0x1f; if (rb.Left() < slen) { Console.WriteLine("UnpackString fixed str failed"); return(false); } value = rb.CopyString(slen); rb.MoveOffset(slen); return(true); } switch (t) { case 0xd9: // str8 { if (rb.Left() < 1) { Console.WriteLine("UnpackString str8 length failed"); return(false); } byte slen = rb.MoveNext(); if (rb.Left() < slen) { Console.WriteLine("UnpackString str8 failed"); return(false); } value = rb.CopyString(slen); rb.MoveOffset(slen); break; } case 0xda: // str16 { ushort slen = 0; if (rb.Left() < 2) { Console.WriteLine("UnpackString str16 length failed"); return(false); } ReadNumber(rb.Data(), rb.Offset(), ref slen); rb.MoveOffset(2); if (rb.Left() < slen) { Console.WriteLine("UnpackString str16 failed"); return(false); } value = rb.CopyString(slen); rb.MoveOffset(slen); break; } case 0xdb: // str32 { uint slen = 0; if (rb.Left() < 4) { Console.WriteLine("UnpackString str32 length failed"); return(false); } ReadNumber(rb.Data(), rb.Offset(), ref slen); rb.MoveOffset(4); if (rb.Left() < slen) { Console.WriteLine("UnpackString str32 failed"); return(false); } value = rb.CopyString((int)slen); rb.MoveOffset((int)slen); break; } default: { Console.WriteLine("UnpackString unknown type " + t.ToString()); return(false); } } return(true); }