-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathByteBuffer.cs
107 lines (92 loc) · 2.04 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
using System;
using System.Collections.Generic;
using System.Text;
namespace LivingThing.LiveBlazor
{
class ByteBuffer
{
internal byte[] buffer;
internal int position;
public ByteBuffer(byte[] buffer)
{
this.buffer = buffer;
}
public byte ReadByte()
{
CheckCanRead(1);
return buffer[position++];
}
public byte[] ReadBytes(int length)
{
CheckCanRead(length);
var value = new byte[length];
Buffer.BlockCopy(buffer, position, value, 0, length);
position += length;
return value;
}
public short ReadInt16()
{
CheckCanRead(2);
short value = (short)(buffer[position]
| (buffer[position + 1] << 8));
position += 2;
return value;
}
public int ReadInt32()
{
CheckCanRead(4);
int value = buffer[position]
| (buffer[position + 1] << 8)
| (buffer[position + 2] << 16)
| (buffer[position + 3] << 24);
position += 4;
return value;
}
public long ReadInt64()
{
CheckCanRead(8);
uint low = (uint)(buffer[position]
| (buffer[position + 1] << 8)
| (buffer[position + 2] << 16)
| (buffer[position + 3] << 24));
uint high = (uint)(buffer[position + 4]
| (buffer[position + 5] << 8)
| (buffer[position + 6] << 16)
| (buffer[position + 7] << 24));
long value = (((long)high) << 32) | low;
position += 8;
return value;
}
public float ReadSingle()
{
if (!BitConverter.IsLittleEndian)
{
var bytes = ReadBytes(4);
Array.Reverse(bytes);
return BitConverter.ToSingle(bytes, 0);
}
CheckCanRead(4);
float value = BitConverter.ToSingle(buffer, position);
position += 4;
return value;
}
public double ReadDouble()
{
if (!BitConverter.IsLittleEndian)
{
var bytes = ReadBytes(8);
Array.Reverse(bytes);
return BitConverter.ToDouble(bytes, 0);
}
CheckCanRead(8);
double value = BitConverter.ToDouble(buffer, position);
position += 8;
return value;
}
void CheckCanRead(int count)
{
if (position + count > buffer.Length)
throw new ArgumentOutOfRangeException();
}
}
}