Ejemplo n.º 1
0
        public object GetField(int n)
        {
            object         res;
            ImageFieldData fi     = GetFieldInfo(n);
            int            count  = fi.Count;
            int            offset = GetFieldOffset(n);;
            Object         o;
            int            len;

            SafePointer sp = m_pHeader + offset;

            if (fi.VarLen)
            {
                // this assumes we can not have varlen arrays of headers
                count = GetFieldSize(n) / fi.GetTypeLen();
            }

            if (count == 1)
            {
                return(sp.SafePointerToType(fi));
            }

            // if a negative count is provided we tread it as an offset of
            // the field where to find the real count
            if (count < 0)
            {
                count = Convert.ToInt32(GetField(n + count));
            }

            res = new object[count];
            for (int i = 0; i < count; i++)
            {
                o = sp.SafePointerToType(fi);
                ((object[])res)[i] = o;
                if (o is ImageHeader)
                {
                    len = ((ImageHeader)o).Size;
                }
                else
                {
                    len = fi.GetTypeLen();
                }
                sp = sp + len;
            }

            return(res);
        }
Ejemplo n.º 2
0
        public int GetFieldSize(int n)
        {
            ImageFieldData fi      = GetFieldInfo(n);
            int            count   = fi.Count;
            int            padding = fi.PadTo;
            int            size;
            int            len;


            if (fi.VarLen)
            {
                SafePointer field_start = m_pHeader + GetFieldOffset(n);
                SafePointer field_end   = field_start;
                while ((byte)field_end != fi.TrailingByte)
                {
                    field_end++;
                }
                // if we have a VarLen and a PadTo specified we will make sure
                // we only skip up to PadTo trailing bytes
                if (padding != 0)
                {
                    padding = padding - (field_end.Address - m_pHeader.Address) % padding;
                }
                else
                {
                    padding = -1;
                }
                while (((byte)field_end == fi.TrailingByte) && (padding-- != 0))
                {
                    field_end++;
                }

                return(field_end - field_start);
            }

            if (fi.Type == Type.HEADER)
            {
                object o = GetField(n);
                if (o is Array)
                {
                    len = ((ImageHeader)((object[])o)[0]).Size;
                }
                else
                {
                    len = ((ImageHeader)o).Size;
                }
            }
            else
            {
                len = fi.GetTypeLen();
            }

            if (count == 1)
            {
                return(len);
            }

            // if a negative count is provided we tread it as an offset of
            // the field where to find the real count
            if (count < 0)
            {
                count = Convert.ToInt32(GetField(n + count));
            }

            size = len * count;

            // We don't pad is the size is already a multiple of padding
            if ((padding != 0) && (size % padding != 0))
            {
                size += padding - (size % padding);
            }

            return(size);
        }