public static void WriteValue(CborWriter writer, object value, bool useDefiniteLengthCollections = true) { switch (value) { case null: writer.WriteNull(); break; case bool b: writer.WriteBoolean(b); break; case int i: writer.WriteInt64(i); break; case long i: writer.WriteInt64(i); break; case ulong i: writer.WriteUInt64(i); break; case float f: writer.WriteSingle(f); break; case double d: writer.WriteDouble(d); break; case string s: writer.WriteTextString(s); break; case byte[] b: writer.WriteByteString(b); break; case byte[][] chunks: WriteChunkedByteString(writer, chunks); break; case string[] chunks: WriteChunkedTextString(writer, chunks); break; case object[] nested when IsCborMapRepresentation(nested): WriteMap(writer, nested, useDefiniteLengthCollections); break; case object[] nested: WriteArray(writer, nested, useDefiniteLengthCollections); break; default: throw new ArgumentException($"Unrecognized argument type {value.GetType()}"); } ; }
public static void ExecOperation(CborWriter writer, string op) { switch (op) { case nameof(writer.WriteInt64): writer.WriteInt64(42); break; case nameof(writer.WriteByteString): writer.WriteByteString(Array.Empty <byte>()); break; case nameof(writer.WriteTextString): writer.WriteTextString(""); break; case nameof(writer.WriteStartTextStringIndefiniteLength): writer.WriteStartTextStringIndefiniteLength(); break; case nameof(writer.WriteStartByteStringIndefiniteLength): writer.WriteStartByteStringIndefiniteLength(); break; case nameof(writer.WriteStartArray): writer.WriteStartArrayIndefiniteLength(); break; case nameof(writer.WriteStartMap): writer.WriteStartMapIndefiniteLength(); break; case nameof(writer.WriteEndByteStringIndefiniteLength): writer.WriteEndByteStringIndefiniteLength(); break; case nameof(writer.WriteEndTextStringIndefiniteLength): writer.WriteEndTextStringIndefiniteLength(); break; case nameof(writer.WriteEndArray): writer.WriteEndArray(); break; case nameof(writer.WriteEndMap): writer.WriteEndMap(); break; default: throw new Exception($"Unrecognized CborWriter operation name {op}"); } }
public static void WriteByteString_SingleValue_HappyPath(string hexInput, string hexExpectedEncoding) { byte[] expectedEncoding = hexExpectedEncoding.HexToByteArray(); byte[] input = hexInput.HexToByteArray(); using var writer = new CborWriter(); writer.WriteByteString(input); AssertHelper.HexEqual(expectedEncoding, writer.GetEncoding()); }
public static void WriteValue(CborWriter writer, object value, bool useDefiniteLengthCollections = true) { switch (value) { case null: writer.WriteNull(); break; case bool b: writer.WriteBoolean(b); break; case int i: writer.WriteInt32(i); break; case long i: writer.WriteInt64(i); break; case ulong i: writer.WriteUInt64(i); break; case float f: writer.WriteSingle(f); break; case double d: writer.WriteDouble(d); break; case decimal d: writer.WriteDecimal(d); break; case string s: writer.WriteTextString(s); break; case BigInteger i: writer.WriteBigInteger(i); break; case DateTimeOffset d: writer.WriteDateTimeOffset(d); break; case byte[] b: writer.WriteByteString(b); break; case byte[][] chunks: WriteChunkedByteString(writer, chunks); break; case string[] chunks when IsIndefiniteLengthByteString(chunks): byte[][] byteChunks = chunks.Skip(1).Select(ch => ch.HexToByteArray()).ToArray(); WriteChunkedByteString(writer, byteChunks); break; case string[] chunks: WriteChunkedTextString(writer, chunks); break; case object[] nested when IsCborMapRepresentation(nested): WriteMap(writer, nested, useDefiniteLengthCollections); break; case object[] nested when IsEncodedValueRepresentation(nested): byte[] encodedValue = ((string)nested[1]).HexToByteArray(); writer.WriteEncodedValue(encodedValue); break; case object[] nested when IsTaggedValueRepresentation(nested): writer.WriteTag((CborTag)nested[0]); WriteValue(writer, nested[1]); break; case object[] nested: WriteArray(writer, nested, useDefiniteLengthCollections); break; default: throw new ArgumentException($"Unrecognized argument type {value.GetType()}"); } ; }
public static void WriteChunkedByteString(CborWriter writer, byte[][] chunks) { writer.WriteStartByteStringIndefiniteLength(); foreach (byte[] chunk in chunks) { writer.WriteByteString(chunk); } writer.WriteEndByteStringIndefiniteLength(); }
public static void WriteEncodedValue_IndefiniteLengthByteString_HappyPath() { using var writer = new CborWriter(encodeIndefiniteLengths: true); writer.WriteStartByteString(); writer.WriteByteString(new byte[] { 1, 1, 1 }); writer.WriteEncodedValue("43020202".HexToByteArray()); writer.WriteEndByteString(); byte[] encoding = writer.GetEncoding(); Assert.Equal("5f4301010143020202ff", encoding.ByteArrayToHex().ToLower()); }
public static void Roundtrip_ByteString(string?hexInput) { byte[]? input = hexInput?.HexToByteArray(); #endif using var writer = new CborWriter(); writer.WriteByteString(input); byte[] encoding = writer.GetEncoding(); var reader = new CborReader(encoding); byte[] result = reader.ReadByteString(); AssertHelper.HexEqual(input ?? Array.Empty <byte>(), result); }
public static void ByteString_Encoding_ShouldContainInputBytes(string?hexInput) { byte[]? input = hexInput?.HexToByteArray(); #endif using var writer = new CborWriter(); writer.WriteByteString(input); byte[] encoding = writer.GetEncoding(); int length = input?.Length ?? 0; int lengthEncodingLength = GetLengthEncodingLength(length); Assert.Equal(lengthEncodingLength + length, encoding.Length); AssertHelper.HexEqual(input ?? Array.Empty <byte>(), encoding.Skip(lengthEncodingLength).ToArray());
public static void WriteArray(CborWriter writer, params object[] values) { writer.WriteStartArray(values.Length); foreach (object value in values) { switch (value) { case int i: writer.WriteInt64(i); break; case string s: writer.WriteTextString(s); break; case byte[] b: writer.WriteByteString(b); break; case object[] nested: ArrayWriterHelper.WriteArray(writer, nested); break; default: throw new ArgumentException($"Unrecognized argument type {value.GetType()}"); } ; } writer.WriteEndArray(); }
public static void WriteValue(CborWriter writer, object value) { switch (value) { case int i: writer.WriteInt64(i); break; case long i: writer.WriteInt64(i); break; case ulong i: writer.WriteUInt64(i); break; case string s: writer.WriteTextString(s); break; case byte[] b: writer.WriteByteString(b); break; case object[] nested when IsCborMapRepresentation(nested): WriteMap(writer, nested); break; case object[] nested: WriteArray(writer, nested); break; default: throw new ArgumentException($"Unrecognized argument type {value.GetType()}"); } ; }