1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
using System;
namespace Org.BouncyCastle.Utilities.Encoders
{
/// <summary>
/// A class that allows encoding of data using a specific encoder to be processed in chunks.
/// </summary>
public class BufferedEncoder
{
internal byte[] Buffer;
internal int bufOff;
internal ITranslator translator;
/// <summary>
/// Create.
/// </summary>
/// <param name="translator">The translator to use.</param>
/// <param name="bufferSize">Size of the chunks.</param>
public BufferedEncoder(
ITranslator translator,
int bufferSize)
{
this.translator = translator;
if ((bufferSize % translator.GetEncodedBlockSize()) != 0)
{
throw new ArgumentException("buffer size not multiple of input block size");
}
Buffer = new byte[bufferSize];
// bufOff = 0;
}
/// <summary>
/// Process one byte of data.
/// </summary>
/// <param name="input">The byte.</param>
/// <param name="outBytes">An array to store output in.</param>
/// <param name="outOff">Offset within output array to start writing from.</param>
/// <returns></returns>
public int ProcessByte(
byte input,
byte[] outBytes,
int outOff)
{
int resultLen = 0;
Buffer[bufOff++] = input;
if (bufOff == Buffer.Length)
{
resultLen = translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
bufOff = 0;
}
return resultLen;
}
/// <summary>
/// Process data from a byte array.
/// </summary>
/// <param name="input">Input data Byte array containing data to be processed.</param>
/// <param name="inOff">Start position within input data array.</param>
/// <param name="len">Amount of input data to be processed.</param>
/// <param name="outBytes">Output data array.</param>
/// <param name="outOff">Offset within output data array to start writing to.</param>
/// <returns>The amount of data written.</returns>
public int ProcessBytes(
byte[] input,
int inOff,
int len,
byte[] outBytes,
int outOff)
{
if (len < 0)
{
throw new ArgumentException("Can't have a negative input length!");
}
int resultLen = 0;
int gapLen = Buffer.Length - bufOff;
if (len > gapLen)
{
Array.Copy(input, inOff, Buffer, bufOff, gapLen);
resultLen += translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
bufOff = 0;
len -= gapLen;
inOff += gapLen;
outOff += resultLen;
int chunkSize = len - (len % Buffer.Length);
resultLen += translator.Encode(input, inOff, chunkSize, outBytes, outOff);
len -= chunkSize;
inOff += chunkSize;
}
if (len != 0)
{
Array.Copy(input, inOff, Buffer, bufOff, len);
bufOff += len;
}
return resultLen;
}
}
}
|