static void Encode(Array value, int width, int encodeSize, ByteBuffer buffer) { encodeSize -= FixedWidth.FormatCode + width; if (width == FixedWidth.UByte) { AmqpBitConverter.WriteUByte(buffer, (byte)encodeSize); AmqpBitConverter.WriteUByte(buffer, (byte)value.Length); } else { AmqpBitConverter.WriteUInt(buffer, (uint)encodeSize); AmqpBitConverter.WriteUInt(buffer, (uint)value.Length); } if (value.Length > 0) { object firstItem = value.GetValue(0); EncodingBase encoding = AmqpEncoding.GetEncoding(firstItem); AmqpBitConverter.WriteUByte(buffer, encoding.FormatCode); if (encoding.FormatCode == FormatCode.Described) { DescribedType describedValue = (DescribedType)firstItem; AmqpEncoding.EncodeObject(describedValue.Descriptor, buffer); AmqpBitConverter.WriteUByte(buffer, AmqpEncoding.GetEncoding(describedValue.Value).FormatCode); } foreach (object item in value) { encoding.EncodeObject(item, true, buffer); } } }
static decimal DecodeDecimal128(ByteBuffer buffer) { byte[] bytes = new byte[FixedWidth.Decimal128]; AmqpBitConverter.ReadBytes(buffer, bytes, 0, bytes.Length); int sign = 1; int exponent = 0; sign = (bytes[0] & 0x80) != 0 ? -1 : 1; if ((bytes[0] & 0x60) != 0x60) { // s 14-bit-exponent (0)113-bit-significant exponent = ((bytes[0] & 0x7F) << 7) | ((bytes[1] & 0xFE) >> 1); bytes[0] = 0; bytes[1] &= 0x1; } else if ((bytes[0] & 0x78) != 0) { // handle NaN and Infinity } else { // s 11 14-bit-exponent (100)111-bit-significant // it is out of the valid range already. Should not be used return(0); } int high = (int)AmqpBitConverter.ReadUInt(bytes, 4, 4); int middle = (int)AmqpBitConverter.ReadUInt(bytes, 8, 4); int low = (int)AmqpBitConverter.ReadUInt(bytes, 12, 4); return(CreateDecimal(low, middle, high, sign, exponent - Decimal128Bias)); }
static decimal DecodeDecimal64(ByteBuffer buffer) { byte[] bytes = new byte[FixedWidth.Decimal64]; AmqpBitConverter.ReadBytes(buffer, bytes, 0, bytes.Length); int sign = 1; int exponent = 0; sign = (bytes[0] & 0x80) != 0 ? -1 : 1; if ((bytes[0] & 0x60) != 0x60) { // s 10-bit-exponent (0)53-bit-significant exponent = ((bytes[0] & 0x7F) << 3) | ((bytes[1] & 0xE0) >> 5); bytes[0] = 0; bytes[1] &= 0x1F; } else if ((bytes[0] & 0x78) != 0) { // handle NaN and Infinity } else { // s 11 10-bit-exponent (100)51-bit-significant exponent = ((bytes[0] & 0x1F) << 8) | ((bytes[1] & 0xF8) >> 3); bytes[0] = 0; bytes[1] &= 0x7; bytes[1] |= 0x20; } int middle = (int)AmqpBitConverter.ReadUInt(bytes, 0, 4); int low = (int)AmqpBitConverter.ReadUInt(bytes, 4, 4); return(CreateDecimal(low, middle, 0, sign, exponent - Decimal64Bias)); }
static decimal DecodeDecimal32(ByteBuffer buffer) { byte[] bytes = new byte[FixedWidth.Decimal32]; AmqpBitConverter.ReadBytes(buffer, bytes, 0, bytes.Length); int sign = 1; int exponent = 0; sign = (bytes[0] & 0x80) != 0 ? -1 : 1; if ((bytes[0] & 0x60) != 0x60) { // s 8-bit-exponent (0)23-bit-significant exponent = ((bytes[0] & 0x7F) << 1) | ((bytes[1] & 0x80) >> 7); bytes[0] = 0; bytes[1] &= 0x7F; } else if ((bytes[0] & 0x78) != 0) { // handle NaN and Infinity } else { // s 11 8-bit-exponent (100)21-bit-significant exponent = ((bytes[0] & 0x1F) << 3) | ((bytes[1] & 0xE0) >> 5); bytes[0] = 0; bytes[1] &= 0x1F; bytes[1] |= 0x80; } int low = (int)AmqpBitConverter.ReadUInt(bytes, 0, bytes.Length); return(CreateDecimal(low, 0, 0, sign, exponent - Decimal32Bias)); }
internal static void Encode(IList value, int count, Type itemType, ByteBuffer buffer) { int width; int encodeSize = ArrayEncoding.GetEncodeSize(value, count, itemType, false, out width); AmqpBitConverter.WriteUByte(buffer, width == FixedWidth.UByte ? FormatCode.Array8 : FormatCode.Array32); ArrayEncoding.Encode(value, count, itemType, width, encodeSize, buffer); }
public static DateTime?Decode(ByteBuffer buffer, FormatCode formatCode) { if (formatCode == 0 && (formatCode = AmqpEncoding.ReadFormatCode(buffer)) == FormatCode.Null) { return(null); } return(ToDateTime(AmqpBitConverter.ReadLong(buffer))); }
public static Guid?Decode(ByteBuffer buffer, FormatCode formatCode) { if (formatCode == 0 && (formatCode = AmqpEncoding.ReadFormatCode(buffer)) == FormatCode.Null) { return(null); } return(AmqpBitConverter.ReadUuid(buffer)); }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { Array array = (Array)value; int width; int encodeSize = ArrayEncoding.GetEncodeSize(array, arrayEncoding, out width); AmqpBitConverter.WriteUByte(buffer, width == FixedWidth.UByte ? FormatCode.Array8 : FormatCode.Array32); ArrayEncoding.Encode(array, width, encodeSize, buffer); }
static void EncodeArray <T>(ByteBuffer buffer, IList <T> array, int count, FormatCode formatCode, Action <ByteBuffer, T, int> encoder) { AmqpBitConverter.WriteUByte(buffer, formatCode); for (int i = 0; i < count; i++) { encoder(buffer, array[i], i); } }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { IList array = (IList)value; Type itemType = array.Count > 0 ? array[0].GetType() : null; int width; int encodeSize = ArrayEncoding.GetEncodeSize(array, array.Count, itemType, arrayEncoding, out width); AmqpBitConverter.WriteUByte(buffer, width == FixedWidth.UByte ? FormatCode.Array8 : FormatCode.Array32); ArrayEncoding.Encode(array, array.Count, itemType, width, encodeSize, buffer); }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { if (arrayEncoding) { AmqpBitConverter.WriteInt(buffer, char.ConvertToUtf32(new string((char)value, 1), 0)); } else { CharEncoding.Encode((char)value, buffer); } }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { if (arrayEncoding) { AmqpBitConverter.WriteLong(buffer, TimeStampEncoding.GetMilliseconds((DateTime)value)); } else { TimeStampEncoding.Encode((DateTime)value, buffer); } }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { if (arrayEncoding) { AmqpBitConverter.WriteUuid(buffer, (Guid)value); } else { UuidEncoding.Encode((Guid)value, buffer); } }
public static void Encode(decimal?value, ByteBuffer buffer) { if (value.HasValue) { AmqpBitConverter.WriteUByte(buffer, FormatCode.Decimal128); DecimalEncoding.EncodeValue(value.Value, buffer); } else { AmqpEncoding.EncodeNull(buffer); } }
public static void Encode(DateTime?value, ByteBuffer buffer) { if (value.HasValue) { AmqpBitConverter.WriteUByte(buffer, FormatCode.TimeStamp); AmqpBitConverter.WriteTimestamp(buffer, value.Value); } else { AmqpEncoding.EncodeNull(buffer); } }
public static void Encode(char?value, ByteBuffer buffer) { if (value.HasValue) { AmqpBitConverter.WriteUByte(buffer, FormatCode.Char); AmqpBitConverter.WriteInt(buffer, char.ConvertToUtf32(new string(value.Value, 1), 0)); } else { AmqpEncoding.EncodeNull(buffer); } }
/// <summary> /// Reads a char from a buffer. /// </summary> /// <param name="buffer">The input buffer.</param> /// <returns>A char.</returns> public static char ReadChar(ByteBuffer buffer) { int intValue = AmqpBitConverter.ReadInt(buffer); string value = char.ConvertFromUtf32(intValue); if (value.Length > 1) { throw new ArgumentOutOfRangeException(CommonResources.ErrorConvertingToChar); } return(value[0]); }
public static FormatCode ReadFormatCode(ByteBuffer buffer) { byte type = AmqpBitConverter.ReadUByte(buffer); byte extType = 0; if (FormatCode.HasExtType(type)) { extType = AmqpBitConverter.ReadUByte(buffer); } return(new FormatCode(type, extType)); }
public static void Encode(Guid?value, ByteBuffer buffer) { if (value.HasValue) { AmqpBitConverter.WriteUByte(buffer, FormatCode.Uuid); AmqpBitConverter.WriteUuid(buffer, value.Value); } else { AmqpEncoding.EncodeNull(buffer); } }
public static void Encode(DateTime?value, ByteBuffer buffer) { if (value.HasValue) { AmqpBitConverter.WriteUByte(buffer, FormatCode.TimeStamp); AmqpBitConverter.WriteLong(buffer, TimeStampEncoding.GetMilliseconds(value.Value)); } else { AmqpEncoding.EncodeNull(buffer); } }
public override void EncodeObject(object value, bool arrayEncoding, ByteBuffer buffer) { if (arrayEncoding) { ArraySegment <byte> binaryValue = (ArraySegment <byte>)value; AmqpBitConverter.WriteUInt(buffer, (uint)binaryValue.Count); AmqpBitConverter.WriteBytes(buffer, binaryValue.Array, binaryValue.Offset, binaryValue.Count); } else { BinaryEncoding.Encode((ArraySegment <byte>)value, buffer); } }
static void Encode(byte[] encodedData, int width, ByteBuffer buffer) { if (width == FixedWidth.UByte) { AmqpBitConverter.WriteUByte(buffer, (byte)encodedData.Length); } else { AmqpBitConverter.WriteUInt(buffer, (uint)encodedData.Length); } AmqpBitConverter.WriteBytes(buffer, encodedData, 0, encodedData.Length); }
public static void Encode <T>(T[] value, ByteBuffer buffer) { if (value == null) { AmqpEncoding.EncodeNull(buffer); } else { int width; int encodeSize = ArrayEncoding.GetEncodeSize(value, false, out width); AmqpBitConverter.WriteUByte(buffer, width == FixedWidth.UByte ? FormatCode.Array8 : FormatCode.Array32); ArrayEncoding.Encode(value, width, encodeSize, buffer); } }
public static void Encode(string value, ByteBuffer buffer) { if (value == null) { AmqpEncoding.EncodeNull(buffer); } else { byte[] encodedData = Encoding.UTF8.GetBytes(value); int encodeWidth = AmqpEncoding.GetEncodeWidthBySize(encodedData.Length); AmqpBitConverter.WriteUByte(buffer, encodeWidth == FixedWidth.UByte ? FormatCode.String8Utf8 : FormatCode.String32Utf8); StringEncoding.Encode(encodedData, encodeWidth, buffer); } }
public static void Encode(AmqpSymbol value, ByteBuffer buffer) { if (value.Value == null) { AmqpEncoding.EncodeNull(buffer); } else { byte[] encodedData = Encoding.ASCII.GetBytes(value.Value); int encodeWidth = AmqpEncoding.GetEncodeWidthBySize(encodedData.Length); AmqpBitConverter.WriteUByte(buffer, encodeWidth == FixedWidth.UByte ? FormatCode.Symbol8 : FormatCode.Symbol32); SymbolEncoding.Encode(encodedData, encodeWidth, buffer); } }
public static void ReadCount(ByteBuffer buffer, FormatCode formatCode, FormatCode formatCode8, FormatCode formatCode32, out int count) { if (formatCode == formatCode8) { count = AmqpBitConverter.ReadUByte(buffer); } else if (formatCode == formatCode32) { count = (int)AmqpBitConverter.ReadUInt(buffer); } else { throw GetEncodingException(AmqpResources.GetString(AmqpResources.AmqpInvalidFormatCode, formatCode, buffer.Offset)); } }
public static void Encode(AmqpMap value, ByteBuffer buffer) { if (value == null) { AmqpEncoding.EncodeNull(buffer); } else { int encodeWidth = MapEncoding.GetEncodeWidth(value); AmqpBitConverter.WriteUByte(buffer, encodeWidth == FixedWidth.UByte ? FormatCode.Map8 : FormatCode.Map32); int size = encodeWidth + value.ValueSize; MapEncoding.Encode(value, encodeWidth, size, buffer); } }
internal static void Encode(IList value, int count, Type itemType, int width, int encodeSize, ByteBuffer buffer) { encodeSize -= FixedWidth.FormatCode + width; if (width == FixedWidth.UByte) { AmqpBitConverter.WriteUByte(buffer, (byte)encodeSize); AmqpBitConverter.WriteUByte(buffer, (byte)count); } else { AmqpBitConverter.WriteUInt(buffer, (uint)encodeSize); AmqpBitConverter.WriteUInt(buffer, (uint)count); } EncodeValue(value, count, itemType, buffer); }
public static char?Decode(ByteBuffer buffer, FormatCode formatCode) { if (formatCode == 0 && (formatCode = AmqpEncoding.ReadFormatCode(buffer)) == FormatCode.Null) { return(null); } int intValue = AmqpBitConverter.ReadInt(buffer); string value = char.ConvertFromUtf32(intValue); if (value.Length > 1) { throw new ArgumentOutOfRangeException(CommonResources.ErrorConvertingToChar); } return(value[0]); }
public static void Encode(IList value, ByteBuffer buffer) { if (value == null) { AmqpEncoding.EncodeNull(buffer); } else if (value.Count == 0) { AmqpBitConverter.WriteUByte(buffer, FormatCode.List0); } else { int valueSize = ListEncoding.GetValueSize(value); int width = AmqpEncoding.GetEncodeWidthByCountAndSize(value.Count, valueSize); AmqpBitConverter.WriteUByte(buffer, width == FixedWidth.UByte ? FormatCode.List8 : FormatCode.List32); int size = width + valueSize; ListEncoding.Encode(value, width, size, buffer); } }