you cannot ToArray the memory stream until you dispose the DeflateStream (as flush is acutally not implemented (and Deflate/GZip compress blocks of data); the final block is only written on close/dispose.
Try the below code:
public static string Base64Compress(string data, Encoding enc)
using (var ms = new MemoryStream())
using (var ds = new DeflateStream(ms, CompressionMode.Compress))
byte b = enc.GetBytes(data);
ds.Write(b, 0, b.Length);