public override byte[] ToBytes() { var s = (string)Value; var addr = s.Split(':'); if (addr.Length != 2) { throw new Exception("Failed to parse addr"); } if (addr[0].Length != 16) { throw new Exception("Failed to parse addr"); } if (!Multibase.TryDecode(addr[0], out var encoding, out var onionHostBytes) || encoding != MultibaseEncoding.Base32Lower) { throw new InvalidOperationException($"{s} is not a valid onion address."); } var i = ushort.Parse(addr[1]); if (i < 1) { throw new Exception("Failed to parse addr"); } return(onionHostBytes.Concat(Binary.BigEndian.GetBytes(i)).ToArray()); }
public override void Decode(string value) { var addr = value.Split(':'); if (addr.Length != 2) { throw new Exception("Failed to parse addr"); } if (addr[0].Length != 16) { throw new Exception("Failed to parse addr"); } if (!Multibase.TryDecode(addr[0], out var encoding, out _) || encoding != MultibaseEncoding.Base32Lower) { throw new InvalidOperationException($"{value} is not a valid onion address."); } var i = ushort.Parse(addr[1]); if (i < 1) { throw new Exception("Failed to parse addr"); } Value = value; }
public void TestTryDecoding_GivenValidEncodedInput_Unprefixed(string input, MultibaseEncoding encoding) { var expected = "Decentralize everything!!"; var result = Multibase.TryDecode(input, out var decodedEncoding, out var decodedBytes); Assert.True(result); Assert.Equal(encoding, decodedEncoding); Assert.Equal(expected, Encoding.UTF8.GetString(decodedBytes)); }
public async Task TestBase58ConcurrentDecoding() { var tasks = Enumerable.Range(1, 10).Select(_ => Task.Run(() => { var success = Multibase.TryDecode("Z6BLZQNPgws5ahFtr8x", out var encoding, out var bytes); Assert.True(success); Assert.Equal(MultibaseEncoding.Base58Flickr, encoding); Assert.Equal("Concurrency !", Encoding.UTF8.GetString(bytes, 0, bytes.Length)); })); await Task.WhenAll(tasks); }