-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathByteBuffer.cs
214 lines (186 loc) · 5.38 KB
/
ByteBuffer.cs
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
namespace Due;
using System;
using System.IO;
public enum ByteOrder : byte
{
LittleEndian = 0,
BigEndian = 1
}
public class ByteBuffer
{
// 字节序;默认为大端序
private ByteOrder byteOrder = ByteOrder.BigEndian;
// 创建一个内存流对象
private MemoryStream buffer = new MemoryStream();
public ByteBuffer()
{
}
public ByteBuffer(ByteOrder byteOrder)
{
this.byteOrder = byteOrder;
}
public ByteBuffer(ByteOrder byteOrder, byte[] buffer)
{
this.byteOrder = byteOrder;
this.buffer = new MemoryStream(buffer);
}
// 获取buffer长度
public long Length()
{
return this.buffer.Length;
}
// 写入byte
public void WriteByte(byte v)
{
this.buffer.WriteByte(v);
}
// 写入bool值
public void WriteBool(bool v)
{
this.buffer.WriteByte((byte)(v ? 1 : 0));
}
// 写入int8值
public void WriteInt8(int v)
{
this.buffer.WriteByte((byte)v);
}
// 写入int6值
public void WriteInt16(Int16 v)
{
if (this.byteOrder == ByteOrder.BigEndian)
{
this.buffer.WriteByte((byte)(v >> 8));
this.buffer.WriteByte((byte)(v & 0xff));
}
else
{
this.buffer.WriteByte((byte)(v & 0xff));
this.buffer.WriteByte((byte)(v >> 8));
}
}
// 写入int32值
public void WriteInt32(Int32 v)
{
if (this.byteOrder == ByteOrder.BigEndian)
{
this.buffer.WriteByte((byte)(v >> 24));
this.buffer.WriteByte((byte)(v >> 16));
this.buffer.WriteByte((byte)(v >> 8));
this.buffer.WriteByte((byte)(v & 0xff));
}
else
{
this.buffer.WriteByte((byte)(v & 0xff));
this.buffer.WriteByte((byte)(v >> 8));
this.buffer.WriteByte((byte)(v >> 16));
this.buffer.WriteByte((byte)(v >> 24));
}
}
// 写入int64
public void WriteInt64(Int64 v)
{
if (this.byteOrder == ByteOrder.BigEndian)
{
this.buffer.WriteByte((byte)(v >> 56));
this.buffer.WriteByte((byte)(v >> 48));
this.buffer.WriteByte((byte)(v >> 40));
this.buffer.WriteByte((byte)(v >> 32));
this.buffer.WriteByte((byte)(v >> 24));
this.buffer.WriteByte((byte)(v >> 16));
this.buffer.WriteByte((byte)(v >> 8));
this.buffer.WriteByte((byte)(v & 0xff));
}
else
{
this.buffer.WriteByte((byte)(v & 0xff));
this.buffer.WriteByte((byte)(v >> 8));
this.buffer.WriteByte((byte)(v >> 16));
this.buffer.WriteByte((byte)(v >> 24));
this.buffer.WriteByte((byte)(v >> 32));
this.buffer.WriteByte((byte)(v >> 40));
this.buffer.WriteByte((byte)(v >> 48));
this.buffer.WriteByte((byte)(v >> 56));
}
}
// 写入bytes值
public void WriteBytes(byte[] v)
{
this.buffer.Write(v, 0, v.Length);
}
// 写入string值
public void WriteString(string v)
{
}
// 读取int8值
public int ReadInt8()
{
int v = this.buffer.ReadByte();
if (v == -1)
{
throw new Exception("Invalid buffer");
}
return v;
}
// 读取int16值
public int ReadInt16()
{
if (this.byteOrder == ByteOrder.BigEndian)
{
return (this.ReadInt8() << 8) | this.ReadInt8();
}
else
{
return this.ReadInt8() | (this.ReadInt8() << 8);
}
}
// 读取int32值
public Int32 ReadInt32()
{
if (this.byteOrder == ByteOrder.BigEndian)
{
return ((Int32)this.ReadInt8() << 24) | ((Int32)this.ReadInt8() << 16) | ((Int32)this.ReadInt8() << 8) | (Int32)this.ReadInt8();
}
else
{
return (Int32)this.ReadInt8() | ((Int32)this.ReadInt8() << 8) | ((Int32)this.ReadInt8() << 16) | ((Int32)this.ReadInt8() << 24);
}
}
// 读取int64值
public Int64 ReadInt64()
{
if (this.byteOrder == ByteOrder.BigEndian)
{
return ((Int64)this.ReadInt8() << 56) | ((Int64)this.ReadInt8() << 48) | ((Int64)this.ReadInt8() << 40) | ((Int64)this.ReadInt8() << 32) | ((Int64)this.ReadInt8() << 24) | ((Int64)this.ReadInt8() << 16) | ((Int64)this.ReadInt8() << 8) | (Int64)this.ReadInt8();
}
else
{
return ((Int64)this.ReadInt8() | ((Int64)this.ReadInt8() << 8) | ((Int64)this.ReadInt8() << 16) | ((Int64)this.ReadInt8() << 24) | ((Int64)this.ReadInt8() << 32) | ((Int64)this.ReadInt8() << 40) | ((Int64)this.ReadInt8() << 48) | ((Int64)this.ReadInt8() << 56));
}
}
// 读取字节数组
public byte[] ReadBytes(Int32 n)
{
Int32 remaining = (Int32)(this.Remaining());
if (n > remaining)
{
n = remaining;
}
byte[] buff = new byte[n];
this.buffer.Read(buff, 0, n);
return buff;
}
// 跳到指定位置
public void Skip(Int64 n)
{
this.buffer.Seek(n, SeekOrigin.Begin);
}
// 获取剩余的数据长度
public Int64 Remaining()
{
return this.buffer.Length - this.buffer.Position;
}
public byte[] ToArrayBuffer()
{
return this.buffer.ToArray();
}
}