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); }
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); }
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); } }
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()); }
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; } }
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; } }
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); }