3 using System.Collections.Generic;
\r
8 public class OctetString
\r
14 #region constructors
\r
15 public OctetString()
\r
17 buffer = new byte[0];
\r
20 public OctetString(int length)
\r
22 buffer = new byte[length];
\r
25 public OctetString(byte[] bytes)
\r
27 buffer = bytes.Clone() as byte[];
\r
32 public byte this[int index]
\r
36 return buffer[index];
\r
40 buffer[index] = value;
\r
45 public byte[] this[int index, int length]
\r
49 return Substring(index, length);
\r
53 Array.Copy(value, 0, buffer, index,
\r
54 (length < 0) ? value.Length : length);
\r
58 public static OctetString operator +
\r
59 (OctetString left, OctetString right)
\r
61 OctetString appended = new OctetString(left.Length + right.Length);
\r
62 Array.Copy(left.buffer, appended.buffer, left.Length);
\r
63 Array.Copy(right.buffer, 0,
\r
64 appended.buffer, left.Length, right.Length);
\r
68 public static OctetString operator +(OctetString left, byte[] right)
\r
70 OctetString appended = new OctetString(left.Length + right.Length);
\r
71 Array.Copy(left.buffer, appended.buffer, left.Length);
\r
72 Array.Copy(right, 0, appended.buffer, left.Length, right.Length);
\r
76 public static implicit operator byte[](OctetString octetString)
\r
78 return octetString.GetBytes();
\r
81 public static implicit operator OctetString(byte[] bytes)
\r
83 return new OctetString(bytes);
\r
93 return buffer.Length;
\r
98 #region public methods
\r
99 public OctetString Substring(int start)
\r
101 return Substring(start, buffer.Length - start);
\r
104 public OctetString Substring(int start, int length)
\r
106 OctetString sub = new OctetString(length);
\r
107 Array.Copy(buffer, start, sub.buffer, 0, length);
\r
111 public byte[] GetBytes()
\r
113 return buffer.Clone() as byte[];
\r
116 public override string ToString()
\r
118 StringBuilder s = new StringBuilder();
\r
119 for (int i = 0; i < buffer.Length; ++i)
\r
121 byte c = buffer[i];
\r
122 if (0x20 <= c && c < 0x7F)
\r
128 s.Append("\\" + c.ToString("X2"));
\r
131 return s.ToString();
\r
134 public static byte[] Substring(byte[] source, int start)
\r
136 return Substring(source, start, source.Length - start);
\r
139 public static byte[] Substring(byte[] source, int start, int length)
\r
141 byte[] sub = new byte[length];
\r
142 Array.Copy(source, start, sub, 0, length);
\r
146 public static byte[] Concat(byte[] first, byte[] second)
\r
148 byte[] joined = new byte[first.Length + second.Length];
\r
149 Array.Copy(first, joined, first.Length);
\r
150 Array.Copy(second, 0, joined, first.Length, second.Length);
\r
154 public static int IndexOf(byte[] field, byte target)
\r
156 return IndexOf(field, target, 0);
\r
159 public static int IndexOf(byte[] field, byte target, int startIndex)
\r
161 for (int i = startIndex; i < field.Length; ++i)
\r
163 if (field[i] == target)
\r
171 public static int IndexOf(byte[] field, byte[] target)
\r
173 return IndexOf(field, target, 0);
\r
176 public static int IndexOf(byte[] field, byte[] target, int startIndex)
\r
178 for (int i = startIndex; i <= field.Length - target.Length; ++i)
\r
181 for (j = 0; j < target.Length; ++j)
\r
183 if (field[i + j] != target[j])
\r
188 if (j == target.Length)
\r