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

ste*_*rnr 40 .net c#

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

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

还有更直接的方法吗?

[[编辑:]]我会告诉我想要更好的实现 - 我有一个byte[],我需要返回一个新的base64编码byte[]

Ste*_*kel 164

Byte [] - > String: 使用 system.convert.tobase64string

Convert.ToBase64String(byte[] data)
Run Code Online (Sandbox Code Playgroud)

String - > Byte []: 使用 system.convert.frombase64string

Convert.FromBase64String(string data)
Run Code Online (Sandbox Code Playgroud)

  • 这就是为什么你_always_向下滚动到第二个答案,哈哈. (28认同)
  • 你能解释一个需要base64字节[]作为byte []的用例吗?我从未在我的生活中有这种需要. (4认同)
  • @robnick:这是一个巨大的禁忌。每个获得base64'd的二进制数据大约是。尺寸大 33%。所以这不是一个真正有用的用例。尽管如此,您的用例只是被 byte[] -> string 覆盖了。 (2认同)

Ere*_*mez 13

Base64是一种以文本形式(作为字符串)表示字节的方法.所以没有Base64编码的字节[].你有一个base64编码的字符串,你可以解码回来byte[].

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

string base64String = Convert.ToBase64String(bytes);
byte[] stringBytes = Encoding.ASCII.GetBytes(base64String);
Run Code Online (Sandbox Code Playgroud)

然而,这没有任何意义,因为将byte []表示为byte []的最佳方法是byte []本身:)

  • 如果您需要通过网络发送 Base64 编码形式怎么办?或者到一个文件?那么你需要将它转换为 byte[]。不要太快地说一些没有意义的话。 (2认同)

Ami*_*ens 6

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

    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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 努力做到这一点的荣誉.但我会坚持使用System.Convert. (3认同)
  • Chmm ... mBufferPos未在代码中声明. (2认同)
  • Amit Bens 代码具有良好的性能,但直到您需要将结果转换为 string 或 char[](表示 UTF16)。这是很常见的情况。然后你会发现它比 System.Convert.ToBase64String 慢了两倍。只是因为最后有一个 System.Text.Encoding.ASCII.GetString(bytes) 。这对我来说是非常出乎意料的。 (2认同)

Blu*_*ueM 5

byte[] base64EncodedStringBytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(binaryData))
Run Code Online (Sandbox Code Playgroud)