I was looking today for a new UUencode function and my colleague ended up with the following class which works like a charm. This one is really fast.
using System;
using System.Text;
public static class Codecs
{
static
readonly byte[] UUEncMap = new byte[]
{
0x60, 0x21, 0x22, 0x23, 0x24,
0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49,
0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
0x57,
0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F
};
static readonly
byte[] UUDecMap = new byte[]
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A,
0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17,
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22,
0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E,
0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A,
0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
};
public static void UUDecode(System.IO.Stream input,
System.IO.Stream output)
{
//if (input == null)
// throw new
ArgumentNullException("input");
//if (output == null)
// throw new
ArgumentNullException("output");
long len = input.Length;
if (len ==
0)
return;
long didx = 0;
int nextByte = input.ReadByte();
while
(nextByte >= 0)
{
// get line length (in number of encoded
octets)
int line_len = UUDecMap[nextByte];
// ascii printable to 0-63 and
4-byte to 3-byte conversion
long end = didx + line_len;
byte A, B, C,
D;
if (end > 2)
{
while (didx < a =" UUDecMap[input.ReadByte()];" b =" UUDecMap[input.ReadByte()];" c =" UUDecMap[input.ReadByte()];" d =" UUDecMap[input.ReadByte()];">> 4) & 3)));
output.WriteByte((byte)(((B <<>> 2) & 15)));
output.WriteByte((byte)(((C
<< a =" UUDecMap[input.ReadByte()];" b =" UUDecMap[input.ReadByte()];">> 4) & 3)));
didx++;
}
if (didx < b =" UUDecMap[input.ReadByte()];" c =" UUDecMap[input.ReadByte()];">> 2) & 15)));
didx++;
}
// skip
padding
do
{
nextByte = input.ReadByte();
}
while (nextByte >=
0 && nextByte != '\n' && nextByte != '\r');
// skip end of
line
do
{
nextByte = input.ReadByte();
}
while (nextByte >= 0
&& (nextByte == '\n' nextByte == '\r'));
}
}
public static
void UUEncode(System.IO.Stream input, System.IO.Stream output)
{
//if
(input == null)
// throw new ArgumentNullException("input");
//if (output
== null)
// throw new ArgumentNullException("output");
long len =
input.Length;
if (len == 0)
return;
int sidx = 0;
int line_len =
45;
byte[] nl = Encoding.ASCII.GetBytes(Environment.NewLine);
byte A, B,
C;
// split into lines, adding line-length and line terminator
while (sidx
+ line_len < end =" sidx" a =" (byte)input.ReadByte();" b =" (byte)input.ReadByte();" c =" (byte)input.ReadByte();">> 2) &
63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 (A <<>> 6) & 3 (B << idx =" 0;" a =" (byte)input.ReadByte();" b =" (byte)input.ReadByte();" c =" (byte)input.ReadByte();">> 2) &
63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 (A <<>> 6) & 3 (B << a =" (byte)input.ReadByte();" b =" (byte)input.ReadByte();">> 2) &
63]);
output.WriteByte(UUEncMap[(B >> 4) & 15 (A << a =" (byte)input.ReadByte();">> 2) & 63]);
output.WriteByte(UUEncMap[(A << idx =" 0;">
I call my function like this:
//First write to memory
MemoryStream
mmsStream = new MemoryStream();
StreamWriter srwTemp = new
StreamWriter(mmsStream);
//sBuffer is my encoded
text.
srwTemp.Write(sBuffer);
srwTemp.Flush();
mmsStream.Position =
0;
//Write to IO..filename is a localvar which
has the location of the file.
System.IO.FileStream stmStreamOut = new
System.IO.FileStream(filename, FileMode.OpenOrCreate);
//Calling
UUDecode
Codecs.UUDecode(mmsStream,
stmStreamOut);
stmStreamOut.Flush();
stmStreamOut.Close();
//Done
Goodluck.