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

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

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

还有更直接的方法吗?

[[编辑:]]我会解释我想要更好的实现 – 我有一个byte[]我需要返回一个新的base64编码byte[]

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

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

 Convert.ToBase64String(byte[] data) 

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

 Convert.FromBase64String(string data) 

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

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

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

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

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

根据您的编辑和评论..这将是你想要的吗?

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

您可以使用String Convert.ToBase64String(byte [])将字节数组编码为base64字符串,然后使用Byte [] Convert.FromBase64String(string)将结果字符串转换回字节数组。