首页>Program>source

我有个 byte[] 我正在寻找对base64进行编码的最有效方法.

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

还有其他更直接的方法吗?

[[编辑:]]我将解释我想要更好地实现的目标-我有一个 byte[] 我需要返回一个新的base64编码的 byte[]

最新回答
  • 29天前
    1 #

    这是将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;
        }
    

  • 29天前
    2 #

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

    Convert.ToBase64String(byte[] data)
    

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

    Convert.FromBase64String(string data)
    

  • 29天前
    3 #

    Base64是一种以文本形式(作为字符串)表示字节的方法.因此,没有Base64编码的byte []这样的东西.您将有一个base64编码的字符串,可以将其解码回到一个 byte[] .

    但是,如果想要以字节数组结尾,则可以采用base64编码的字符串并将其转换为字节数组,例如:

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

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

  • 29天前
    4 #

    byte[] base64EncodedStringBytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(binaryData))
    

  • 29天前
    5 #

    根据您的编辑和评论..这就是您要的吗?

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

  • oop:C#:将基类转换为子类
  • c#:如何使按钮看起来像被按下一样?