Пример #1
0
        public string[] ReadStringArray()
        {
            StringTypeFlag flag = (StringTypeFlag)_reader.ReadByte();

            if (flag == StringTypeFlag.NULL)
            {
                return(null);
            }
            int len;

            if (flag == StringTypeFlag.ByteLen)
            {
                len = _reader.ReadByte();
            }
            else if (flag == StringTypeFlag.ShortLen)
            {
                len = _reader.ReadInt16();
            }
            else
            {
                len = _reader.ReadInt32();
            }

            string[] ret = new string[len];

            for (int i = 0; i < len; i++)
            {
                ret[i] = ReadString();
            }
            return(ret);
        }
Пример #2
0
        public void WriteString(string str)
        {
            CheckBufferPoll(1);

            if (str == null)
            {
                _ms.WriteByte((byte)StringTypeFlag.NULL);
                return;
            }
            else if (string.IsNullOrWhiteSpace(str))
            {
                _ms.WriteByte((byte)StringTypeFlag.Empty);
                return;
            }

            byte[]         byts;
            StringTypeFlag flag = StringTypeFlag.DEFAULT;
            //bool isAsscii = StringHelper.IsAscii(str);
            bool isAsscii = false;

            if (isAsscii)
            {
                flag = StringTypeFlag.AssciiEncoding;
                byts = Encoding.ASCII.GetBytes(str);
            }
            else
            {
                flag = StringTypeFlag.UTF8Encoding;
                byts = Encoding.UTF8.GetBytes(str);
            }

            byte[] lenbytes = null;

            flag    |= StringTypeFlag.IntLen;
            lenbytes = BitConverter.GetBytes(byts.Length);

            CheckBufferPoll(5 + byts.Length);

            _ms.WriteByte((byte)flag);
            _ms.Write(lenbytes, 0, lenbytes.Length);

            _ms.Write(byts, 0, byts.Length);
        }
        public void WriteString(string str)
        {
            CheckBufferPoll(1);

            if (str == null)
            {
                _ms.WriteByte((byte)StringTypeFlag.NULL);
                return;
            }
            else if (string.IsNullOrWhiteSpace(str))
            {
                _ms.WriteByte((byte)StringTypeFlag.Empty);
                return;
            }

            byte[]         byts;
            StringTypeFlag flag = StringTypeFlag.DEFAULT;
            //bool isAsscii = StringHelper.IsAscii(str);
            bool isAsscii = false;

            if (isAsscii)
            {
                flag = StringTypeFlag.AssciiEncoding;
                byts = Encoding.ASCII.GetBytes(str);
            }
            else
            {
                flag = StringTypeFlag.UTF8Encoding;
                byts = Encoding.UTF8.GetBytes(str);
            }

            byte[] lenbytes = null;
            if (byts.Length <= byte.MaxValue)
            {
                flag    |= StringTypeFlag.ByteLen;
                lenbytes = new byte[] { (byte)byts.Length };
            }
            else if (byts.Length <= Int16.MaxValue)
            {
                flag    |= StringTypeFlag.ShortLen;
                lenbytes = BitConverter.GetBytes((Int16)byts.Length);
            }
            else if (byts.LongLength <= Int32.MaxValue)
            {
                flag    |= StringTypeFlag.IntLen;
                lenbytes = BitConverter.GetBytes(byts.Length);
            }
            else if (byts.LongLength < Int64.MaxValue)
            {
                flag    |= StringTypeFlag.LongLen;
                lenbytes = BitConverter.GetBytes(byts.LongLength);
            }
            else
            {
                throw new OverflowException("字符串太长。");
            }

            CheckBufferPoll(5 + byts.Length);

            _ms.WriteByte((byte)flag);
            _ms.Write(lenbytes, 0, lenbytes.Length);

            _ms.Write(byts, 0, byts.Length);
        }