C# Base64编码字节数组的有效方法?

C# Base64编码字节数组的有效方法?,c#,.net,C#,.net,我有一个byte[],我正在寻找最有效的base64编码方法 问题是内置的.Net方法Convert.FromBase64CharArray需要一个char[]作为输入,而将我的byte[]转换为char[]只是为了再次将其转换为base64编码数组似乎相当愚蠢 有没有更直接的方法 [[EDIT:]我将导出我想要更好的内容-我有一个字节[],我需要返回一个新的base64编码的字节[]字节[]->字符串: 使用 字符串->字节[]: 使用 Base64是一种以文本形式(作为字符串)表示字节的

我有一个
byte[]
,我正在寻找最有效的base64编码方法

问题是内置的.Net方法
Convert.FromBase64CharArray
需要一个
char[]
作为输入,而将我的
byte[]
转换为
char[]
只是为了再次将其转换为base64编码数组似乎相当愚蠢

有没有更直接的方法


[[EDIT:]我将导出我想要更好的内容-我有一个
字节[]
,我需要返回一个新的base64编码的
字节[]
字节[]->字符串: 使用

字符串->字节[]: 使用


Base64是一种以文本形式(作为字符串)表示字节的方法。所以根本就没有Base64编码字节[]。您将拥有一个base64编码字符串,可以将其解码回
字节[]

但是,如果希望以字节数组结束,可以将base64编码的字符串转换为字节数组,如:

string base64String = Convert.ToBase64String(bytes);
byte[] stringBytes = Encoding.ASCII.GetBytes(base64String);

但是,这毫无意义,因为将字节[]表示为字节[]的最佳方式是字节[]本身:)

您可以使用字符串Convert.ToBase64String(字节[])将字节数组编码为base64字符串,然后使用字节[]Convert.FromBase64String(字符串)将生成的字符串转换回字节数组。

基于您的编辑和注释。。这就是你想要的吗

byte[] newByteArray = UTF8Encoding.UTF8.GetBytes(Convert.ToBase64String(currentByteArray));

下面是base64直接编码到字节数组的代码(经过测试,执行的是+-10%的.Net实现,但分配了一半的内存):

static public void testBase64EncodeToBuffer()
{
对于(int i=1;i<200;++i)
{
//准备测试数据
字节[]测试数据=新字节[i];
对于(int j=0;j>2*6)&0x3F];
buffer[bufferPos++]=base64编码表[(三元组>>1*6)&0x3F];
buffer[bufferPos++]=base64编码表[(三元组>>0*6)&0x3F];
如果(添加换行符)
{
如果(++lineCount==19)
{
缓冲区[bufferPos++]=13;
缓冲区[bufferPos++]=10;
行数=0;
}
}
}
//最后字节
如果(sizeMod<大小)
{
八位字节a=偏移量>2*6)&0x3F];
buffer[bufferPos++]=base64编码表[(三元组>>1*6)&0x3F];
buffer[bufferPos++]=base64编码表[(三元组>>0*6)&0x3F];
//添加填充“=”
sizeMod=大小%3;
//最后一个字符肯定是填充的
缓冲区[bufferPos-1]=(字节)'=';
如果(sizeMod==1)缓冲区[bufferPos-2]=(字节)'=';
}
返回缓冲区;
}

从字节到base64字符串检索图像

模型属性:

    public byte[] NomineePhoto { get; set; }

    public string NomineePhoneInBase64Str 
    {
        get {
            if (NomineePhoto == null)
                return "";

            return $"data:image/png;base64,{Convert.ToBase64String(NomineePhoto)}";
        } 
    }
鉴于:

   <img style="height:50px;width:50px" src="@item.NomineePhoneInBase64Str" />


字节数组的编码是什么?ascii,utf8,等等?你写你想转换成base64而不是“FromBase64”也许我遗漏了什么。。但是你不能使用
string Convert.ToBase64String(byte[])
byte[]Convert.FromBase64String(string)
?@SimonWhitehead我更新了我的问题,以澄清为什么这不好,因为将字符串转换为字节是另一回事。使用byte[]Encoding.ASCII.GetBytes(base64字符串)您能解释一个需要base64字节[]作为byte[]的用例吗?在我的生活中,我从来没有这样的需要。将字符串转换成字节是另一回事。使用Encoding.ASCII.GetBytes(字符串)这就是为什么你总是向下滚动到第二个答案,哈哈。@robnick:这是一个巨大的禁忌。每一个获得base64'd的二进制数据的大小都大约大33%。所以这不是一个真正有用的用例。尽管如此,您的用例只包含byte[]->string。如果您需要用ajax下载pdf或“格式化文件”,那么只需将其作为二进制响应类型下载即可。没有理由将其转换为文本。我们知道base-64字符串将在ASCII范围内,因此直接使用ASCII编码可能更有效(因为它将与UTF8产生的内容相同)。如果需要通过网络发送Base64编码的表单,该怎么办?还是归档?然后需要将其转换为字节[]。不要太快说一些没有意义的话。@AmitBens当然可以,但是如果API
byte[] base64EncodedStringBytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(binaryData))
    static public void testBase64EncodeToBuffer()
    {
        for (int i = 1; i < 200; ++i)
        {
            // prep test data
            byte[] testData = new byte[i];
            for (int j = 0; j < i; ++j)
                testData[j] = (byte)(j ^ i);

            // test
            testBase64(testData);
        }
    }

    static void testBase64(byte[] data)
    {
        if (!appendBase64(data, 0, data.Length, false).SequenceEqual(System.Text.Encoding.ASCII.GetBytes(Convert.ToBase64String(data)))) throw new Exception("Base 64 encoding failed");
    }

    static public byte[] appendBase64(byte[] data
                              , int offset
                              , int size
                              , bool addLineBreaks = false)
    {
        byte[] buffer;
        int bufferPos = 0;
        int requiredSize = (4 * ((size + 2) / 3));
        // size/76*2 for 2 line break characters    
        if (addLineBreaks) requiredSize += requiredSize + (requiredSize / 38);

        buffer = new byte[requiredSize];

        UInt32 octet_a;
        UInt32 octet_b;
        UInt32 octet_c;
        UInt32 triple;
        int lineCount = 0;
        int sizeMod = size - (size % 3);
        // adding all data triplets
        for (; offset < sizeMod;)
        {
            octet_a = data[offset++];
            octet_b = data[offset++];
            octet_c = data[offset++];

            triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

            buffer[bufferPos++] = base64EncodingTable[(triple >> 3 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 2 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 1 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 0 * 6) & 0x3F];
            if (addLineBreaks)
            {
                if (++lineCount == 19)
                {
                    buffer[bufferPos++] = 13;
                    buffer[bufferPos++] = 10;
                    lineCount = 0;
                }
            }
        }

        // last bytes
        if (sizeMod < size)
        {
            octet_a = offset < size ? data[offset++] : (UInt32)0;
            octet_b = offset < size ? data[offset++] : (UInt32)0;
            octet_c = (UInt32)0; // last character is definitely padded

            triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

            buffer[bufferPos++] = base64EncodingTable[(triple >> 3 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 2 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 1 * 6) & 0x3F];
            buffer[bufferPos++] = base64EncodingTable[(triple >> 0 * 6) & 0x3F];

            // add padding '='
            sizeMod = size % 3;
            // last character is definitely padded
            buffer[bufferPos - 1] = (byte)'=';
            if (sizeMod == 1) buffer[bufferPos - 2] = (byte)'=';
        }
        return buffer;
    }
    public void ProcessRequest(HttpContext context)
    {
        string constring = ConfigurationManager.ConnectionStrings["SQL_Connection_String"].ConnectionString;
        SqlConnection conn = new SqlConnection(constring);
        conn.Open();
        SqlCommand cmd = new SqlCommand("select image1 from TestGo where TestId=1", conn);
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();
        MemoryStream str = new MemoryStream();

        context.Response.Clear();
        Byte[] bytes = (Byte[])dr[0];
        string d = System.Text.Encoding.Default.GetString(bytes);
        byte[] bytes2 = Convert.FromBase64String(d);
        //context.Response.Write(d);
        Image img = Image.FromStream(new MemoryStream(bytes2));
        img.Save(context.Response.OutputStream, ImageFormat.Png);
        context.Response.Flush();
        str.WriteTo(context.Response.OutputStream);
        str.Dispose();
        str.Close();
        conn.Close();
        context.Response.End();
    }
    public byte[] NomineePhoto { get; set; }

    public string NomineePhoneInBase64Str 
    {
        get {
            if (NomineePhoto == null)
                return "";

            return $"data:image/png;base64,{Convert.ToBase64String(NomineePhoto)}";
        } 
    }
   <img style="height:50px;width:50px" src="@item.NomineePhoneInBase64Str" />