public static IEnumerable <Packet> ParsePackets(this BinaryStringReader binaryString) { do { yield return(binaryString.GetNextPacket()); } while (binaryString.HasMorePackets); }
public static IEnumerable <(string, string)> ReadProperties([CanBeNull] string input, [CanBeNull] Action <string, Exception> errorCallback) { if (input == null) { return(Array.Empty <(string, string)>()); } try { var properties = new List <(string, string)>(); var reader = new BinaryStringReader(Convert.FromBase64String(input)); while (reader.HasDataLeft) { var name = reader.Read(); var value = reader.Read(); properties.Add((name, value)); } return(properties); } catch (Exception error) { errorCallback?.Invoke($"Failed to read property names and values from input string '{input}'.", error); return(Array.Empty <(string, string)>()); } }
public void Reader_should_correctly_read_strings_written_by_writer() { var writer = new BinaryStringWriter(1); writer.Write(""); writer.Write("Hello!"); writer.Write("Привет!"); var base64 = writer.ToBase64String(); var reader = new BinaryStringReader(Convert.FromBase64String(base64)); reader.Read().Should().Be(""); reader.Read().Should().Be("Hello!"); reader.Read().Should().Be("Привет!"); reader.HasDataLeft.Should().BeFalse(); }
public Packet GetNextPacket() { var version = TakeInt64(3); var typeId = TakeInt64(3); if (typeId == 4) { return(new LiteralValue(version, typeId, TakeLiteralValue())); } var lengthTypeId = TakeInt64(1); if (lengthTypeId == 0) { var totalLength = TakeInt64(15); BinaryStringReader valuePacket = TakeBinaryString((int)totalLength); var subPackets = valuePacket.ParsePackets().ToList(); return(new Operator(version, typeId, subPackets)); } if (lengthTypeId == 1) { long totalPackets = TakeInt64(11); List <Packet> subPackets = new List <Packet>(); for (int i = 0; i < totalPackets; i++) { subPackets.Add(GetNextPacket()); } return(new Operator(version, typeId, subPackets)); } throw new NotImplementedException(); }