示例#1
0
 public bool Equals(TimeData timer)
 {
     return(sec == timer.sec && nsec == timer.nsec);
 }
示例#2
0
 public bool Equals(TimeData timer)
 {
     return (sec == timer.sec && nsec == timer.nsec);
 }
示例#3
0
        private static object _deserialize(Type T, Type container, byte[] bytes, out int amountread, bool sizeknown)
        {
            if (bytes == null && !WHAT_IS_HAPPENING || bytes.Length == 0 && !WHAT_IS_HAPPENING)
            {
                //                Console.WriteLine("Deserializing empty array?");
                amountread = 0;
                return(null);
            }
            object thestructure = null;

            if (T.FullName.Contains("System.") && !T.IsCOMObject && !T.IsArray && T != typeof(string))
            {
                thestructure = new object();
                int    size = Marshal.SizeOf(T);
                IntPtr mem  = IntPtr.Zero;
                if (bytes.Length != 0)
                {
                    mem = Marshal.AllocHGlobal(size);
                    Marshal.Copy(bytes, 0, mem, size);
                }
                amountread = size;
                if (WHAT_IS_HAPPENING)
                {
                    /*
                     * Console.WriteLine("//deserialize: " + T.FullName);
                     * /*Console.WriteLine(string.Format(@"    $A = new {0}();
                     * IntPtr $B = Marshal.AllocHGlobal({1})
                     * Marshal.Copy(bytes, 0, $B, {1});
                     * $A = Marshal.PtrToStructure($B, typeof({0}));
                     * ", T.FullName, Marshal.SizeOf(T)));*/
                }
                if (mem == IntPtr.Zero)
                {
                    return(null);
                }
                object obj = Marshal.PtrToStructure(mem, T);
                Marshal.FreeHGlobal(mem);
                return(obj);
            }
            IRosMessage MSG;
            int         startingpos = 0, currpos = 0;

            /*if (container==null)
             * currpos = 4;*/
            MsgTypes MT = MsgTypes.Unknown;

            FieldInfo[] infos = GetFields(T, ref thestructure, out MSG);
            if (MSG != null)
            {
                MT = MSG.msgtype;
            }
            startingpos = currpos;

            int currinfo = 0;

            while ((currpos < bytes.Length || WHAT_IS_HAPPENING) && currinfo < infos.Length)
            {
                // Console.WriteLine(infos[currinfo].Name + "(" + currpos + "/" + bytes.Length + ")");
                Type type = GetType(infos[currinfo].FieldType.FullName);
                //Console.WriteLine("GetType returned: " + type.FullName);
                Type realtype = infos[currinfo].FieldType;

                MsgTypes msgtype          = GetMessageType(type);
                bool     knownpiecelength = IsSizeKnown(realtype, true) && MSG.Fields != null && !MSG.Fields[infos[currinfo].Name].IsArray || MSG.Fields[infos[currinfo].Name].Length != -1;

                if (realtype == typeof(Byte[])) //this is deplorable.
                {
                    //SHORTCUT
                    byte[]       PWNED;
                    MsgFieldInfo mfi = MSG.Fields[infos[currinfo].Name];
                    int          num = mfi.Length;
                    if (mfi.Length == -1) //if -1, then array length not in definition
                    {
                        num      = BitConverter.ToInt32(bytes, currpos);
                        currpos += 4;
                    }
                    PWNED = new byte[num];
                    Array.Copy(bytes, currpos, PWNED, 0, num);
                    currpos += PWNED.Length;
                    infos[currinfo].SetValue(thestructure, PWNED);
                    PWNED = null;
                }
                else if (realtype == typeof(Boolean[]))
                {
                    bool[]       PWNED;
                    MsgFieldInfo mfi = MSG.Fields[infos[currinfo].Name];
                    int          num = mfi.Length;
                    if (mfi.Length == -1) //if -1, then array length not in definition
                    {
                        num      = BitConverter.ToInt32(bytes, currpos);
                        currpos += 4;
                    }
                    PWNED = new bool[num];
                    for (int i = 0; i < num; i++)
                    {
                        PWNED[i] = bytes[i + currpos] > 0;
                    }
                    currpos += PWNED.Length;
                    infos[currinfo].SetValue(thestructure, PWNED);
                    PWNED = null;
                }
                else if (knownpiecelength)
                {
                    if (infos[currinfo].FieldType.IsArray && msgtype != MsgTypes.std_msgs__String)
                    //must have length defined, or else knownpiecelength would be false... so look it up in the dict!
                    {
                        Type TT = GetType(infos[currinfo].FieldType.GetElementType().FullName);
                        if (TT.IsArray)
                        {
                            throw new Exception("ERIC, YOU NEED TO MAKE DESERIALIZATION RECURSE!!!");
                        }
                        Array vals = (infos[currinfo].GetValue(thestructure) as Array);
                        if (vals != null)
                        {
                            for (int i = 0; i < vals.Length; i++)
                            {
                                MsgTypes mt   = GetMessageType(TT);
                                int      leng = 0;
                                Type     et   = realtype.GetElementType();
                                if (mt == MsgTypes.Unknown)
                                {
                                    leng = Marshal.SizeOf(et);
                                }
                                if (leng == 0)
                                {
                                    leng = Marshal.SizeOf(vals.GetValue(i));
                                }
                                if (leng == 0)
                                {
                                    throw new Exception("LENGTH ENUMERATION FAIL IN DESERIALIZE!");
                                }
                                if (leng + currpos <= bytes.Length)
                                {
                                    IntPtr pIP = Marshal.AllocHGlobal(leng);
                                    Marshal.Copy(bytes, currpos, pIP, leng);
                                    object o = Marshal.PtrToStructure(pIP, TT);
                                    vals.SetValue(o, i);
                                    Marshal.FreeHGlobal(pIP);
                                }
                                else
                                {
                                    vals.SetValue(null, i);
                                }
                                currpos += leng;
                            }
                        }
                        infos[currinfo].SetValue(thestructure, vals);
                    }
                    else
                    {
                        if (type.FullName != null && type.FullName.Contains("Message"))
                        {
                            if (GetMessageType(realtype) == MsgTypes.std_msgs__Time || GetMessageType(realtype) == MsgTypes.std_msgs__Duration || infos[currinfo].FieldType == typeof(TimeData))
                            {
                                TimeData td;
                                if (currpos + 8 <= bytes.Length)
                                {
                                    uint u1 = BitConverter.ToUInt32(bytes, currpos);
                                    uint u2 = BitConverter.ToUInt32(bytes, currpos + 4);
                                    td = new TimeData(u1, u2);
                                }
                                else
                                {
                                    td = new TimeData(0, 0);
                                }
                                currpos += 8;
                                if (infos[currinfo].FieldType == typeof(TimeData))
                                {
                                    infos[currinfo].SetValue(thestructure, td);
                                }
                                else if (GetMessageType(realtype) == MsgTypes.std_msgs__Time)
                                {
                                    infos[currinfo].SetValue(thestructure, (object)new std_msgs.Time(td));
                                }
                                else
                                {
                                    infos[currinfo].SetValue(thestructure, (object)new std_msgs.Duration(td));
                                }
                            }
                            else
                            {
                                byte[] piece = new byte[bytes.Length != 0 ? bytes.Length - currpos : 0];
                                if (bytes.Length != 0)
                                {
                                    Array.Copy(bytes, currpos, piece, 0, piece.Length);
                                }
                                int    len = 0;
                                object obj = _deserialize(realtype, T, piece, out len,
                                                          IsSizeKnown(realtype, true));
                                //if ((int)(infos[currinfo].Attributes & FieldAttributes.InitOnly) != 0)
                                infos[currinfo].SetValue(thestructure, obj);
                                currpos += len;
                            }
                        }
                        else if (msgtype == MsgTypes.std_msgs__Bool)
                        {
                            infos[currinfo].SetValue(thestructure, bytes[currpos] != 0);
                            currpos++;
                        }
                        else
                        {
                            int    len = Marshal.SizeOf(infos[currinfo].GetValue(thestructure));
                            IntPtr pIP = Marshal.AllocHGlobal(len);
                            object obj = null;
                            if (currpos + len <= bytes.Length)
                            {
                                Marshal.Copy(bytes, currpos, pIP, len);
                                obj = Marshal.PtrToStructure(pIP, infos[currinfo].FieldType);
                            }
                            infos[currinfo].SetValue(thestructure, obj);
                            currpos += len;
                        }
                    }
                }
                else
                {
                    Type ft = realtype;
                    if (ft.IsArray)
                    {
                        Type  TT       = ft.GetElementType();
                        Array val      = infos[currinfo].GetValue(thestructure) as Array;
                        int   chunklen = 0;
                        if (val == null)
                        {
                            if (currpos + 4 <= bytes.Length)
                            {
                                chunklen = BitConverter.ToInt32(bytes, currpos);
                                currpos += 4;
                                val      = Array.CreateInstance(TT, chunklen);
                            }
                            else
                            {
                                currpos += 4;
                                val      = Array.CreateInstance(TT, 0);
                            }
                        }
                        else
                        {
                            chunklen = val.Length;
                        }
                        if (TT == null)
                        {
                            throw new Exception("LENGTHLESS ARRAY FAIL -- ELEMENT TYPE IS NULL!");
                        }
                        if (TT.FullName.Contains("Message."))
                        {
                            throw new Exception("NOT YET, YOUNG PATAWAN");
                        }
                        MsgTypes mt = GetMessageType(TT);
                        if (mt == MsgTypes.std_msgs__Byte || mt == MsgTypes.std_msgs__UInt8 || mt == MsgTypes.std_msgs__Int8)
                        {
                            int    num   = val.Length;
                            byte[] PWNED = new byte[num];
                            if (currpos + num <= bytes.Length)
                            {
                                Array.Copy(bytes, currpos, PWNED, 0, num);
                            }
                            currpos += num;
                            infos[currinfo].SetValue(thestructure, PWNED);
                        }
                        else if (TT.FullName != null && TT.FullName.Contains("Message"))
                        {
                            for (int i = 0; i < chunklen; i++)
                            {
                                byte[] chunk = new byte[bytes.Length - currpos];
                                Array.Copy(bytes, currpos, chunk, 0, chunk.Length);
                                int    len  = 0;
                                object data = _deserialize(TT, T, chunk, out len,
                                                           IsSizeKnown(TT, false));
                                val.SetValue(data, i);
                                currpos += len;
                            }
                            infos[currinfo].SetValue(thestructure, val);
                        }
                        else if (TT == typeof(string))
                        {
                            for (int i = 0; i < chunklen; i++)
                            {
                                int len = 0;
                                if (currpos + 4 <= bytes.Length)
                                {
                                    len = BitConverter.ToInt32(bytes, currpos);
                                }
                                byte[] piece = new byte[len];
                                currpos += 4;
                                if (currpos + len <= bytes.Length)
                                {
                                    Array.Copy(bytes, currpos, piece, 0, len);
                                }
                                string str = Encoding.ASCII.GetString(piece);
                                val.SetValue(str, i);
                                currpos += len;
                            }
                            infos[currinfo].SetValue(thestructure, val);
                        }
                        else
                        {
                            int    len = Marshal.SizeOf(TT);
                            IntPtr pIP = IntPtr.Zero;
                            if (currpos + len * chunklen <= bytes.Length)
                            {
                                pIP = Marshal.AllocHGlobal(len * chunklen);
                                Marshal.Copy(bytes, currpos, pIP, len * chunklen);
                            }
                            object o = null;
                            for (int i = 0; i < chunklen * len; i += len)
                            {
                                if (pIP != IntPtr.Zero)
                                {
                                    o = Marshal.PtrToStructure(pIP, TT);
                                }
                                val.SetValue(o, i / len);
                                if (pIP != IntPtr.Zero)
                                {
                                    pIP = new IntPtr(pIP.ToInt32() + len);
                                }
                            }
                            infos[currinfo].SetValue(thestructure, val);
                            currpos += chunklen * len;
                        }
                    }
                    else
                    {
                        if (ft.FullName != null && ft.FullName.Contains("Message"))
                        {
                            IRosMessage msg       = (IRosMessage)Activator.CreateInstance(ft);
                            Type        t         = GetType(msg.GetType().FullName);
                            bool        knownsize = IsSizeKnown(t, false) && MSG.Fields != null && !MSG.Fields[infos[currinfo].Name].IsArray || MSG.Fields[infos[currinfo].Name].Length != -1;
                            if (!knownsize && t.GetField("data").FieldType == typeof(string))
                            {
                                int len = -4;
                                if (currpos + 4 <= bytes.Length)
                                {
                                    len = BitConverter.ToInt32(bytes, currpos);
                                }
                                byte[] smallerpiece = new byte[len + 4];
                                if (currpos + 4 <= bytes.Length)
                                {
                                    Array.Copy(bytes, currpos, smallerpiece, 0, smallerpiece.Length);
                                }
                                int dontcare = 0;
                                msg = _deserialize(t, T, smallerpiece, out dontcare, false) as IRosMessage;
                                if (bytes.Length != 0 && dontcare != len + 4)
                                {
                                    throw new Exception("WTF?!");
                                }
                                infos[currinfo].SetValue(thestructure, msg);
                                currpos += len + 4;
                            }
                            else // if (!knownsize)
                            {
                                byte[] smallerpiece = new byte[bytes.Length != 0 ? bytes.Length - currpos : 0];
                                if (bytes.Length != 0)
                                {
                                    Array.Copy(bytes, currpos, smallerpiece, 0, smallerpiece.Length);
                                }
                                int len = 0;
                                msg = _deserialize(t, T, smallerpiece, out len, knownsize) as IRosMessage;
                                infos[currinfo].SetValue(thestructure, msg);
                                currpos += len;
                            }

                            /*else
                             * {
                             *  throw new Exception("THIS BROKE SOMEHOW! FIX IT!");
                             * }*/
                        }
                        else
                        {
                            if (infos[currinfo].FieldType == typeof(string))
                            {
                                int len = 0;
                                if (currpos + 4 <= bytes.Length)
                                {
                                    len = BitConverter.ToInt32(bytes, currpos);
                                }
                                byte[] piece = new byte[len];
                                currpos += 4;
                                if (currpos + len <= bytes.Length)
                                {
                                    Array.Copy(bytes, currpos, piece, 0, len);
                                }
                                string str = Encoding.ASCII.GetString(piece);
                                infos[currinfo].SetValue(thestructure, str);
                                currpos += len;
                            }
                            else
                            {
                                //Console.WriteLine("ZOMG HANDLE: " + infos[currinfo].FieldType.FullName);
                                amountread = currpos - startingpos;
                                return(thestructure);
                            }
                        }
                    }
                }
                currinfo++;
            }
            amountread = currpos - startingpos;
            infos      = null;
            bytes      = null;
            return(thestructure);
        }
示例#4
0
 public static ulong toLong(TimeData td)
 {
     return (ulong)ROS.ticksFromData(td);
 }
示例#5
0
 public uint getParent(TimeData time_, ref string error_str)
 {
     return getParent(toLong(time_), ref error_str);
 }
示例#6
0
 public bool getData(TimeData time_, ref TransformStorage data_out, ref string error_str)
 {
     return getData(toLong(time_), ref data_out, ref error_str);
 }
        private static void _deserialize(ref object thestructure, ref int currpos, Type T, Type container, byte[] bytes, out int amountread, bool sizeknown)
        {
            if (bytes == null || bytes.Length - currpos == 0)
            {
                amountread = 0;
                return;
            }
            if (T.FullName.StartsWith("System.") && !T.IsCOMObject && !T.IsArray)
            {
                int size;
                if (T == typeof(string))
                {
                    //it's a string!
                    size = 0;
                    if (currpos + 4 > bytes.Length)
                    {
                        throw new Exception("No room in array to read string length");
                    }
                    size = BitConverter.ToInt32(bytes, currpos) + 4;
                    if (currpos + size > bytes.Length)
                    {
                        throw new Exception("No room in array to read string");
                    }
                    string str = Encoding.ASCII.GetString(bytes, currpos + 4, size - 4);
                    thestructure = str;
                }
                else if (T == typeof(char))
                {
                    //.NET chars are 16bits -- the one we're receiving is 8bits
                    thestructure = (char)bytes[currpos];
                    size         = 1;
                }
                else if (T == typeof(bool))
                {
                    //1 byte in size, but a bit derpy as far as marshallability
                    thestructure = bytes[currpos] != 0;
                    size         = 1;
                }
                else
                {
                    size = Marshal.SizeOf(T);
                    IntPtr mem = IntPtr.Zero;
                    if (bytes.Length != 0)
                    {
                        mem = Marshal.AllocHGlobal(size);
                        Marshal.Copy(bytes, currpos, mem, size);
                    }
                    if (mem == IntPtr.Zero)
                    {
                        throw new Exception("Alloc failed");
                    }
                    thestructure = Marshal.PtrToStructure(mem, T);
                    Marshal.FreeHGlobal(mem);
                }
                currpos   += size;
                amountread = size;
                return;
            }
            IRosMessage MSG;
            int         startingpos = currpos;
            MsgTypes    MT          = MsgTypes.Unknown;

            FieldInfo[] infos = GetFields(T, ref thestructure, out MSG);
            if (MSG != null)
            {
                MT = MSG.msgtype;
            }

            //iterate over all fields of MSG, recursing for a sub-message where necessary
            int currinfo = 0;

            while ((currpos < bytes.Length) && currinfo < infos.Length)
            {
                FieldInfo    info = infos[currinfo];
                MsgFieldInfo mfi  = MSG.Fields[info.Name];
                if (mfi.IsConst)
                {
                    continue;
                }
                Type     realtype         = info.FieldType;
                Type     type             = GetType(realtype.FullName);
                bool     isMessage        = realtype.FullName != null && realtype.FullName.StartsWith("Message");
                MsgTypes msgtype          = GetMessageType(type);
                MsgTypes realmsgtype      = GetMessageType(realtype);
                bool     knownpiecelength = IsSizeKnown(realtype, true);

                if (realtype.IsArray)
                {
                    #region ARRAY

                    Type ArrayElementType = realtype.GetElementType();

                    #region ARRAY THAT CAN BE HANDLED AS A WHOLE

                    if (ArrayElementType == typeof(byte))
                    {
                        //SHORTCUT FOR BYTE ARRAYS
                        int num = mfi.Length;
                        if (mfi.Length == -1) //if -1, then array length not in definition
                        {
                            num      = BitConverter.ToInt32(bytes, currpos);
                            currpos += 4;
                        }
                        byte[] PWNED = new byte[num];
                        Array.Copy(bytes, currpos, PWNED, 0, num);
                        currpos += PWNED.Length;
                        info.SetValue(thestructure, PWNED);
                    }
                    else if (ArrayElementType == typeof(bool))
                    {
                        //SHORTCUT FOR BOOL ARRAYS
                        int num = mfi.Length;
                        if (mfi.Length == -1) //if -1, then array length not in definition
                        {
                            num      = BitConverter.ToInt32(bytes, currpos);
                            currpos += 4;
                        }
                        bool[] PWNED = new bool[num];
                        for (int i = 0; i < num; i++)
                        {
                            PWNED[i] = bytes[i + currpos] != 0;
                        }
                        currpos += PWNED.Length;
                        info.SetValue(thestructure, PWNED);
                    }
                    else if (ArrayElementType == typeof(char))
                    {
                        //make sure we handle chars correctly (8bit in serialized message, vs 16bit struct size)
                        int num = mfi.Length;
                        if (mfi.Length == -1)
                        {
                            num      = BitConverter.ToInt32(bytes, currpos);
                            currpos += 4;
                        }
                        char[] PWNED = new char[num];
                        for (int i = 0; i < num; i++)
                        {
                            PWNED[i] = (char)bytes[currpos + i];
                        }
                        currpos += PWNED.Length;
                        info.SetValue(thestructure, PWNED);
                    }
                    #endregion

                    else
                    {
                        MsgTypes ArrayElementMsgType = GetMessageType(ArrayElementType);
                        bool     ElementSizeKnown    = IsSizeKnown(ArrayElementType, true);
                        bool     isElementMessage    = (ArrayElementMsgType != MsgTypes.Unknown);
                        Array    vals = (info.GetValue(thestructure) as Array);

                        #region determine array element size (if determinable)

                        int chunklen = mfi.Length;
                        if (vals == null)
                        {
                            if (chunklen != -1)
                            {
                                //if not -1, then size of array hardcoded in msg definition
                                vals = Array.CreateInstance(ArrayElementType, chunklen);
                            }
                            else if (currpos + 4 <= bytes.Length)
                            {
                                chunklen = BitConverter.ToInt32(bytes, currpos);
                                vals     = Array.CreateInstance(ArrayElementType, chunklen);
                                currpos += 4;
                            }
                            else
                            {
                                throw new Exception("32bit array length extends beyond serialized data");
                            }
                        }
                        else
                        {
                            chunklen = vals.Length;
                        }

                        if (chunklen == -1)
                        {
                            throw new Exception("Could not determine number of array elements to deserialize");
                        }

                        #endregion

                        if (isElementMessage || ArrayElementType == typeof(string))
                        {
                            //handle each message or string in arrays of either as independent non-array things
                            int len;
                            for (int i = 0; i < chunklen; i++)
                            {
                                len = 0;
                                object data = null;
                                _deserialize(ref data, ref currpos, ArrayElementType, T, bytes, out len, ElementSizeKnown);
                                if (data.GetType() != vals.GetType().GetElementType())
                                {
                                    throw new Exception("Type missmatch fail");
                                }
                                vals.SetValue(data, i);
                            }
                        }
                        else
                        {
                            //Array of literals with known size
                            int    len = Marshal.SizeOf(ArrayElementType);
                            IntPtr pIP = IntPtr.Zero, sIP = IntPtr.Zero;
                            if (currpos + len * chunklen <= bytes.Length)
                            {
                                sIP = pIP = Marshal.AllocHGlobal(len * chunklen);
                                Marshal.Copy(bytes, currpos, pIP, len * chunklen);
                            }
                            object o = null;
                            for (int i = 0; i < chunklen * len; i += len)
                            {
                                if (pIP != IntPtr.Zero)
                                {
                                    o = Marshal.PtrToStructure(pIP, ArrayElementType);
                                }
                                vals.SetValue(o, i / len);
                                if (pIP != IntPtr.Zero)
                                {
                                    pIP = new IntPtr(pIP.ToInt32() + len);
                                }
                            }
                            if (sIP != IntPtr.Zero)
                            {
                                Marshal.FreeHGlobal(sIP);
                            }
                            currpos += chunklen * len;
                        }
                        info.SetValue(thestructure, vals);
                    }

                    #endregion
                }
                else
                {
                    #region NON-ARRAY
                    if (isMessage)
                    {
                        if (realmsgtype == MsgTypes.std_msgs__Time || realmsgtype == MsgTypes.std_msgs__Duration || info.FieldType == typeof(TimeData))
                        {
                            //special cased because of custom 8-byte time struct
                            TimeData td;
                            if (currpos + 8 <= bytes.Length)
                            {
                                uint u1 = BitConverter.ToUInt32(bytes, currpos);
                                uint u2 = BitConverter.ToUInt32(bytes, currpos + 4);
                                td = new TimeData(u1, u2);
                            }
                            else
                            {
                                throw new Exception("TimeData fail");
                            }
                            currpos += 8;
                            if (info.FieldType == typeof(TimeData))
                            {
                                info.SetValue(thestructure, td);
                            }
                            else if (GetMessageType(realtype) == MsgTypes.std_msgs__Time)
                            {
                                info.SetValue(thestructure, (object)new std_msgs.Time(td));
                            }
                            else
                            {
                                info.SetValue(thestructure, (object)new std_msgs.Duration(td));
                            }
                        }
                        else
                        {
                            //all other message types, with extra verification for the length of strings
                            int       len       = 0;
                            object    obj       = null;
                            FieldInfo datafield = null;
                            bool      isastring = false;
                            if (!knownpiecelength)
                            {
                                datafield = realtype.GetField("data");
                                isastring = (datafield != null && datafield.FieldType == typeof(string));
                            }
                            if (isastring)
                            {
                                if (currpos + 4 <= bytes.Length)
                                {
                                    len = BitConverter.ToInt32(bytes, currpos);
                                }
                            }
                            int dontcare = 0;
                            _deserialize(ref obj, ref currpos, realtype, T, bytes, out dontcare, knownpiecelength);
                            if (isastring && bytes.Length != 0 && dontcare != len + 4)
                            {
                                throw new Exception("WTF?!");
                            }
                            info.SetValue(thestructure, obj);
                        }
                    }
                    else //if (!isMessage)
                    {
                        if (!knownpiecelength || realtype == typeof(bool) || realtype == typeof(char))
                        {
                            //handle special cases (strings, bools, chars) specially
                            int    dontcare = 0;
                            object obj      = "";
                            _deserialize(ref obj, ref currpos, realtype, T, bytes, out dontcare, false);
                            info.SetValue(thestructure, obj);
                        }
                        else
                        {
                            if (info.FieldType == typeof(bool))
                            {
                                info.SetValue(thestructure, bytes[currpos] != 0);
                                currpos += 1;
                            }
                            else
                            {
                                //non-array literal
                                int    len = Marshal.SizeOf(info.GetValue(thestructure));
                                IntPtr pIP = Marshal.AllocHGlobal(len);
                                object obj = null;
                                if (currpos + len <= bytes.Length)
                                {
                                    Marshal.Copy(bytes, currpos, pIP, len);
                                    obj = Marshal.PtrToStructure(pIP, info.FieldType);
                                }
                                info.SetValue(thestructure, obj);
                                Marshal.FreeHGlobal(pIP);
                                currpos += len;
                            }
                        }
                    }

                    #endregion
                }
                currinfo++;
            }
            amountread = currpos - startingpos;
            infos      = null;
            bytes      = null;
        }