OSDN Git Service

NMEAパケットの部分実装(GPDTM, GPGBS, GPGLL)
[yubeshi/yubeshi.git] / Yubeshi / OctetString.cs
1 \r
2 using System;\r
3 using System.Collections.Generic;\r
4 using System.Text;\r
5 \r
6 namespace Yubeshi\r
7 {\r
8     public class OctetString\r
9     {\r
10         #region fields\r
11         byte[] buffer;\r
12         #endregion\r
13 \r
14         #region constructors\r
15         public OctetString()\r
16         {\r
17             buffer = new byte[0];\r
18         }\r
19 \r
20         public OctetString(int length)\r
21         {\r
22             buffer = new byte[length];\r
23         }\r
24 \r
25         public OctetString(byte[] bytes)\r
26         { \r
27             buffer = bytes.Clone() as byte[];\r
28         }\r
29         #endregion\r
30 \r
31         #region operators\r
32         public byte this[int index]\r
33         {\r
34             get\r
35             {\r
36                 return buffer[index];\r
37             }\r
38             set\r
39             {\r
40                 buffer[index] = value;\r
41             }\r
42         }\r
43 \r
44 \r
45         public byte[] this[int index, int length]\r
46         {\r
47             get\r
48             {\r
49                 return Substring(index, length);\r
50             }\r
51             set\r
52             {\r
53                 Array.Copy(value, 0, buffer, index, \r
54                                          (length < 0) ? value.Length : length);\r
55             }\r
56         }\r
57 \r
58         public static OctetString operator + \r
59                                         (OctetString left, OctetString right)\r
60         {\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
65             return appended;\r
66         }\r
67 \r
68         public static OctetString operator +(OctetString left, byte[] right)\r
69         {\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
73             return appended;\r
74         }\r
75 \r
76         public static implicit operator byte[](OctetString octetString)\r
77         {\r
78             return octetString.GetBytes();\r
79         }\r
80 \r
81         public static implicit operator OctetString(byte[] bytes)\r
82         {\r
83             return new OctetString(bytes);\r
84         }\r
85 \r
86         #endregion\r
87 \r
88         #region properties\r
89         public int Length\r
90         {\r
91             get\r
92             {\r
93                 return buffer.Length;\r
94             }\r
95         }\r
96         #endregion\r
97 \r
98         #region public methods\r
99         public OctetString Substring(int start)\r
100         {\r
101             return Substring(start, buffer.Length - start);\r
102         }\r
103 \r
104         public OctetString Substring(int start, int length)\r
105         {\r
106             OctetString sub = new OctetString(length);\r
107             Array.Copy(buffer, start, sub.buffer, 0, length);\r
108             return sub;\r
109         }\r
110         \r
111         public byte[] GetBytes()\r
112         {\r
113             return buffer.Clone() as byte[];\r
114         }\r
115 \r
116         public override string ToString()\r
117         {\r
118             StringBuilder s = new StringBuilder();\r
119             for (int i = 0; i < buffer.Length; ++i)\r
120             { \r
121                 byte c = buffer[i];\r
122                 if (0x20 <= c && c < 0x7F)\r
123                 {\r
124                     s.Append((char)c);\r
125                 }\r
126                 else\r
127                 {\r
128                     s.Append("\\" + c.ToString("X2"));\r
129                 }\r
130             }\r
131             return s.ToString();\r
132         }\r
133 \r
134         public static byte[] Substring(byte[] source, int start)\r
135         {\r
136             return Substring(source, start, source.Length - start);\r
137         }\r
138 \r
139         public static byte[] Substring(byte[] source, int start, int length)\r
140         {\r
141             byte[] sub = new byte[length];\r
142             Array.Copy(source, start, sub, 0, length);\r
143             return sub;\r
144         }\r
145 \r
146         public static byte[] Concat(byte[] first, byte[] second)\r
147         {\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
151             return joined;\r
152         }\r
153 \r
154         public static int IndexOf(byte[] field, byte target)\r
155         {\r
156             return IndexOf(field, target, 0);\r
157         }\r
158 \r
159         public static int IndexOf(byte[] field, byte target, int startIndex)\r
160         {\r
161             for (int i = startIndex; i < field.Length; ++i)\r
162             {\r
163                 if (field[i] == target)\r
164                 {\r
165                     return i;\r
166                 }\r
167             }\r
168             return -1;\r
169         }\r
170 \r
171         public static int IndexOf(byte[] field, byte[] target)\r
172         {\r
173             return IndexOf(field, target, 0);\r
174         }\r
175 \r
176         public static int IndexOf(byte[] field, byte[] target, int startIndex)\r
177         {\r
178             for (int i = startIndex; i <= field.Length - target.Length; ++i)\r
179             {\r
180                 int j;\r
181                 for (j = 0; j < target.Length; ++j)\r
182                 {\r
183                     if (field[i + j] != target[j])\r
184                     {\r
185                         break;\r
186                     }\r
187                 }\r
188                 if (j == target.Length)\r
189                 {\r
190                     return i;\r
191                 }\r
192             }\r
193             return -1;\r
194         }\r
195 \r
196         #endregion\r
197     }\r
198 }\r