public static bool UnpackBytes(ReadBuffer rb, ref byte[] value) { byte t = rb.MoveNext(); if (t == 0xc0) { value = null; return(true); } switch (t) { case 0xc4: // bin8 { if (rb.Left() < 1) { Console.WriteLine("UnpackBytes bin8 length failed"); return(false); } byte slen = rb.MoveNext(); if (rb.Left() < slen) { Console.WriteLine("UnpackBytes bin failed"); return(false); } value = rb.CopyBytes(slen); rb.MoveOffset(slen); break; } case 0xc5: // bin16 { ushort slen = 0; if (rb.Left() < 2) { Console.WriteLine("UnpackBytes bin16 length failed"); return(false); } ReadNumber(rb.Data(), rb.Offset(), ref slen); rb.MoveOffset(2); if (rb.Left() < slen) { Console.WriteLine("UnpackBytes bin16 failed"); return(false); } value = rb.CopyBytes(slen); rb.MoveOffset(slen); break; } case 0xc6: // bin32 { uint slen = 0; if (rb.Left() < 4) { Console.WriteLine("UnpackBytes bin32 length failed"); return(false); } ReadNumber(rb.Data(), rb.Offset(), ref slen); rb.MoveOffset(4); if (rb.Left() < slen) { Console.WriteLine("UnpackBytes bin32 failed"); return(false); } value = rb.CopyBytes((int)slen); rb.MoveOffset((int)slen); break; } default: { Console.WriteLine("UnpackBytes unknown type " + t.ToString()); return(false); } } return(true); }