Beispiel #1
0
        /// <summary> Deserializes an item's (field/global param/...) value </summary>
        /// <param name="itemVal">item's value</param>
        /// <param name="itemAttr">item's attribute</param>
        /// <param name="itemLen">item's length</param>
        /// <param name="useHex">indicates whether the itemVal is in Hex or Base64</param>
        /// <param name="cellAttr">cell's attribute - relevant only if 'itemAttr' is vector</param>
        /// <param name="parsedLen">out parameter. Returns the length of itemVal parsed</param>
        /// <returns></returns>
        public static String deSerializeItemVal(String itemVal, StorageAttribute itemAttr, int itemLen, bool useHex, StorageAttribute cellAttr, out int parsedLen)
        {
            String        val = null;
            int           idx = 0;
            int           len, endIdx;
            StringBuilder suffixBuf = null;
            String        tmp       = null;

            if (itemAttr == StorageAttribute.ALPHA ||
                itemAttr == StorageAttribute.UNICODE ||
                itemAttr == StorageAttribute.BLOB ||
                itemAttr == StorageAttribute.BLOB_VECTOR ||
                itemAttr == StorageAttribute.DOTNET)
            {
                // first 4 characters are the length of the string (hex number)
                endIdx = idx + 4;
                tmp    = itemVal.Substring(idx, (endIdx) - (idx));
                len    = Convert.ToInt32(tmp, 16);
                idx    = endIdx;
            }
            else if (itemAttr == StorageAttribute.BOOLEAN)
            {
                len = 1;
            }
            else
            {
                int significantNumSize = Manager.Environment.GetSignificantNumSize();
                if (useHex)
                {
                    len = significantNumSize * 2;
                }
                else
                {
                    //if working in base64
                    len = (((significantNumSize + 2) / 3) * 4);
                }
            }
            // Oops, did we bumped into a spanned record (We identify it when the high-most bit is on)?
            if ((len & 0x8000) > 0)
            {
                suffixBuf = new StringBuilder();
                len       = (len & 0x7FFF);

                if (itemAttr == StorageAttribute.BLOB || itemAttr == StorageAttribute.BLOB_VECTOR ||
                    itemAttr == StorageAttribute.DOTNET)
                {
                    if (useHex)
                    {
                        len *= 2;
                    }
                    else
                    {
                        len = (((len + 2) / 3) * 4);
                    }
                }

                parsedLen = getSpannedField(itemVal, len, idx, itemAttr, suffixBuf, useHex);
                val       = suffixBuf.ToString();
                endIdx    = idx + parsedLen;
            }
            else
            {
                if (itemAttr == StorageAttribute.BLOB ||
                    itemAttr == StorageAttribute.BLOB_VECTOR ||
                    itemAttr == StorageAttribute.DOTNET)
                {
                    if (useHex)
                    {
                        len *= 2;
                    }
                    else
                    {
                        len = (((len + 2) / 3) * 4);
                    }
                }

                endIdx = idx + len;
                if (endIdx > itemVal.Length)
                {
                    throw new ApplicationException("in Record.fillFieldsData() data string too short:\n" + itemVal);
                }

                if (UtilStrByteMode.isLocaleDefLangDBCS() && itemAttr == StorageAttribute.BLOB_VECTOR)
                {
                    val = getString(itemVal.Substring(idx, (endIdx) - (idx)), itemAttr, useHex, (cellAttr == StorageAttribute.ALPHA));
                }
                else
                {
                    val = getString(itemVal.Substring(idx, (endIdx) - (idx)), itemAttr, useHex);
                }
            }

            idx = endIdx;

            if (itemAttr == StorageAttribute.ALPHA || itemAttr == StorageAttribute.UNICODE)
            {
                len = itemLen;
                val = StrUtil.padStr(val, len);

                if (itemAttr == StorageAttribute.ALPHA && UtilStrByteMode.isLocaleDefLangDBCS())
                {
                    val = UtilStrByteMode.leftB(val, len);
                }
            }

            parsedLen = endIdx;
            return(val);
        }