我有一个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)
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直接编码到字节数组的代码(测试执行.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)
byte[] base64EncodedStringBytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(binaryData))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78577 次 |
| 最近记录: |