Пример #1
0
            public void WriteString(string value)
            {
                if (mWireType != WireType.String)
                {
                    DebugLogTypeError();
                }
                if (value == null)
                {
                    throw new ArgumentNullException("WriteString 写入数据不可为空");
                }
                int len = value.Length;

                if (len == 0)
                {
                    WriteUInt32Variant(0);
                    mWireType = WireType.None;
                    return;
                }

                int predicted = Encoding.UTF8.GetByteCount(value);

                WriteUInt32Variant((uint)predicted);
                ChoseLength(predicted);
                int actual = Encoding.UTF8.GetBytes(value, 0, value.Length, mDate, mIndex);

                PBHelperCSLE.DebugAssert(predicted == actual);
                IncrementedAndReset(actual);
            }
Пример #2
0
            public void WriteBytes(byte[] data, int offset, int length)
            {
                if (data == null)
                {
                    throw new ArgumentNullException("传入的数组不可为空");
                }
                switch (mWireType)
                {
                case WireType.Fixed32:
                    if (length != 4)
                    {
                        throw new InvalidOperationException("length");
                    }
                    goto CopyFixedLength;

                case WireType.Fixed64:
                    if (length != 8)
                    {
                        throw new InvalidOperationException("长度与类型不对应 length:" + length + "wiretype:" + mWireType);
                    }
                    goto CopyFixedLength;

                case WireType.String:
                    WriteUInt32Variant((uint)length);
                    goto CopyFixedLength;
                }
                throw new InvalidOperationException("WriteBytes WireType 类型错误");
CopyFixedLength:
                ChoseLength(length);
                PBHelperCSLE.BlockCopy(data, offset, mDate, mIndex, length);
                IncrementedAndReset(length);
            }
Пример #3
0
            public float ReadSingle(WireType _wt)
            {
                switch (_wt)
                {
                case WireType.Fixed32:
                {
                    int value = ReadInt32(_wt);
                    return(BitConverter.ToSingle(BitConverter.GetBytes(value), 0));
                }

                case WireType.Fixed64:
                {
                    double value = ReadDouble(_wt);
                    float  f     = (float)value;
                    if (PBHelperCSLE.IsInfinity(f) &&
                        !PBHelperCSLE.IsInfinity(value))
                    {
                        throw new InvalidOperationException("ReadSingle 读取错误 value:" + value);
                    }
                    return(f);
                }

                default:
                    throw new InvalidOperationException("错误的读取类型 ReadSingle:" + _wt);
                }
            }
Пример #4
0
            public void Write(object _value, int _fieldnumber)
            {
                if (_value == null || !IsWriteDefaultValue && IsDefaultValue(_value))
                {
                    return;
                }
                WireType twiretype = PBHelperCSLE.GetWireType(_value.GetType());

                WriteFieldHeader(_fieldnumber, twiretype);
                WriteByType(_value, _value.GetType());
            }
Пример #5
0
            public void WriteDouble(double value)
            {
                switch (mWireType)
                {
                case WireType.Fixed32:
                    float f = (float)value;
                    if (PBHelperCSLE.IsInfinity(f) &&
                        !PBHelperCSLE.IsInfinity(value))
                    {
                        throw new InvalidOperationException("WriteDouble Fixed32 " + value);
                    }
                    WriteSingle(f);
                    return;

                case WireType.Fixed64:
                    WriteInt64(BitConverter.ToInt64(BitConverter.GetBytes(value), 0));
                    return;

                default:
                    DebugLogTypeError();
                    break;
                }
            }
Пример #6
0
            public void WriteByType(object _value, Type _type)
            {
                ProtoTypeCode code = PBHelperCSLE.GetTypeCode(_type);

                switch (code)
                {
                case ProtoTypeCode.Int32:
                    WriteInt32((int)_value);
                    break;

                case ProtoTypeCode.UInt32:
                    WriteUInt32((uint)_value);
                    break;

                case ProtoTypeCode.Int64:
                    WriteInt64((long)_value);
                    break;

                case ProtoTypeCode.UInt64:
                    WriteUInt64((ulong)_value);
                    break;

                case ProtoTypeCode.String:
                    WriteString((string)_value);
                    break;

                case ProtoTypeCode.Single:
                    WriteSingle((float)_value);
                    break;

                case ProtoTypeCode.Double:
                    WriteDouble((double)_value);
                    break;

                case ProtoTypeCode.Boolean:
                    WriteBoolean((bool)_value);
                    break;

                case ProtoTypeCode.Char:
                case ProtoTypeCode.Byte:
                    WriteByte((byte)_value);
                    break;

                case ProtoTypeCode.SByte:
                    WriteSByte((sbyte)_value);
                    break;

                case ProtoTypeCode.Int16:
                    WriteInt16((short)_value);
                    break;

                case ProtoTypeCode.UInt16:
                    WriteUInt16((ushort)_value);
                    break;

                case ProtoTypeCode.Guid:
                case ProtoTypeCode.Uri:
                case ProtoTypeCode.ByteArray:
                case ProtoTypeCode.Type:
                case ProtoTypeCode.TimeSpan:
                case ProtoTypeCode.Decimal:
                case ProtoTypeCode.DateTime:
                    WriteString((string)_value.ToString());
                    break;
                }
            }
Пример #7
0
            public object ReadByData(Type _type, WireType _wt)
            {
                ProtoTypeCode code = PBHelperCSLE.GetTypeCode(_type);
                object        ret  = null;

                switch (code)
                {
                case ProtoTypeCode.Int32:
                    ret = ReadInt32(_wt);
                    break;

                case ProtoTypeCode.UInt32:
                    ret = ReadUInt32(_wt);
                    break;

                case ProtoTypeCode.Int64:
                    ret = ReadInt64(_wt);
                    break;

                case ProtoTypeCode.UInt64:
                    ret = ReadUInt64(_wt);
                    break;

                case ProtoTypeCode.Single:
                    ret = ReadSingle(_wt);
                    break;

                case ProtoTypeCode.Double:
                    ret = ReadDouble(_wt);
                    break;

                case ProtoTypeCode.Boolean:
                    ret = ReadBoolean(_wt);
                    break;

                case ProtoTypeCode.Char:
                case ProtoTypeCode.Byte:
                    ret = ReadByte(_wt);
                    break;

                case ProtoTypeCode.SByte:
                    ret = ReadSByte(_wt);
                    break;

                case ProtoTypeCode.Int16:
                    ret = ReadInt16(_wt);
                    break;

                case ProtoTypeCode.UInt16:
                    ret = ReadUInt16(_wt);
                    break;

                case ProtoTypeCode.Guid:
                case ProtoTypeCode.Uri:
                case ProtoTypeCode.ByteArray:
                case ProtoTypeCode.Type:
                case ProtoTypeCode.TimeSpan:
                case ProtoTypeCode.Decimal:
                case ProtoTypeCode.DateTime:
                case ProtoTypeCode.String:
                    ret = ReadString(_wt);
                    break;
                }
                return(ret);
            }