From dc8149fc64e589baed39022a08c882c8b19e3094 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Tue, 13 Aug 2013 15:14:17 +0100 Subject: [PATCH] Optimize FromBase64String to return Empty when presented with an empty string. This fixes issue 61. --- src/ProtocolBuffers.Test/ByteStringTest.cs | 17 +++++++++++++++++ src/ProtocolBuffers/ByteString.cs | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ProtocolBuffers.Test/ByteStringTest.cs b/src/ProtocolBuffers.Test/ByteStringTest.cs index 97425fe894..003307aef5 100644 --- a/src/ProtocolBuffers.Test/ByteStringTest.cs +++ b/src/ProtocolBuffers.Test/ByteStringTest.cs @@ -34,6 +34,7 @@ #endregion +using System; using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -127,5 +128,21 @@ namespace Google.ProtocolBuffers ByteString bs = ByteString.CopyFrom("\u20ac", Encoding.Unicode); Assert.AreEqual("\u20ac", bs.ToString(Encoding.Unicode)); } + + [TestMethod] + public void FromBase64_WithText() + { + byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6}; + string base64 = Convert.ToBase64String(data); + ByteString bs = ByteString.FromBase64(base64); + TestUtil.AssertBytesEqual(data, bs.ToByteArray()); + } + + [TestMethod] + public void FromBase64_Empty() + { + // Optimization which also fixes issue 61. + Assert.AreSame(ByteString.Empty, ByteString.FromBase64("")); + } } } \ No newline at end of file diff --git a/src/ProtocolBuffers/ByteString.cs b/src/ProtocolBuffers/ByteString.cs index 8b7bd06c6b..434865b7f3 100644 --- a/src/ProtocolBuffers/ByteString.cs +++ b/src/ProtocolBuffers/ByteString.cs @@ -129,7 +129,9 @@ namespace Google.ProtocolBuffers /// public static ByteString FromBase64(string bytes) { - return new ByteString(Convert.FromBase64String(bytes)); + // By handling the empty string explicitly, we not only optimize but we fix a + // problem on CF 2.0. See issue 61 for details. + return bytes == "" ? Empty : new ByteString(Convert.FromBase64String(bytes)); } ///