public static byte[] ASCII85Decode(byte[] inp) { MemoryStream outp = new MemoryStream(); int state = 0; int[] chn = new int[5]; for (int k = 0; k < inp.Length; ++k) { int ch = inp[k] & 0xff; if (ch == '~') break; if (PRTokeniser.IsWhitespace(ch)) continue; if (ch == 'z' && state == 0) { outp.WriteByte(0); outp.WriteByte(0); outp.WriteByte(0); outp.WriteByte(0); continue; } if (ch < '!' || ch > 'u') throw new ArgumentException("Illegal character in ASCII85Decode."); chn[state] = ch - '!'; ++state; if (state == 5) { state = 0; int rx = 0; for (int j = 0; j < 5; ++j) rx = rx * 85 + chn[j]; outp.WriteByte((byte)(rx >> 24)); outp.WriteByte((byte)(rx >> 16)); outp.WriteByte((byte)(rx >> 8)); outp.WriteByte((byte)rx); } } int r = 0; // We'll ignore the next two lines for the sake of perpetuating broken PDFs // if (state == 1) // throw new ArgumentException("Illegal length in ASCII85Decode."); if (state == 2) { r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85 + 85 * 85 * 85 + 85 * 85 + 85; outp.WriteByte((byte)(r >> 24)); } else if (state == 3) { r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85 + chn[2] * 85 * 85 + 85 * 85 + 85; outp.WriteByte((byte)(r >> 24)); outp.WriteByte((byte)(r >> 16)); } else if (state == 4) { r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85 + chn[2] * 85 * 85 + chn[3] * 85 + 85; outp.WriteByte((byte)(r >> 24)); outp.WriteByte((byte)(r >> 16)); outp.WriteByte((byte)(r >> 8)); } return outp.ToArray(); }
public byte[] Decode(byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary) { MemoryStream outS = EnableMemoryLimitsAwareHandler(streamDictionary); b = PdfReader.ASCII85Decode(b, outS); return(b); }