1
- namespace Renci . SshNet . Common
1
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
2
+ using System ;
3
+ using System . Buffers . Binary ;
4
+ #endif
5
+
6
+ namespace Renci . SshNet . Common
2
7
{
3
8
/// <summary>
4
9
/// Provides convenience methods for conversion to and from both Big Endian and Little Endian.
@@ -12,24 +17,13 @@ internal static class Pack
12
17
/// <returns>Converted <see cref="ushort" />.</returns>
13
18
internal static ushort LittleEndianToUInt16 ( byte [ ] buffer )
14
19
{
20
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
21
+ return BinaryPrimitives . ReadUInt16LittleEndian ( buffer ) ;
22
+ #else
15
23
ushort n = buffer [ 0 ] ;
16
24
n |= ( ushort ) ( buffer [ 1 ] << 8 ) ;
17
25
return n ;
18
- }
19
-
20
- /// <summary>
21
- /// Converts little endian bytes into number.
22
- /// </summary>
23
- /// <param name="buffer">The buffer.</param>
24
- /// <param name="offset">The buffer offset.</param>
25
- /// <returns>Converted <see cref="uint" />.</returns>
26
- internal static uint LittleEndianToUInt32 ( byte [ ] buffer , int offset )
27
- {
28
- uint n = buffer [ offset ] ;
29
- n |= ( uint ) buffer [ offset + 1 ] << 8 ;
30
- n |= ( uint ) buffer [ offset + 2 ] << 16 ;
31
- n |= ( uint ) buffer [ offset + 3 ] << 24 ;
32
- return n ;
26
+ #endif
33
27
}
34
28
35
29
/// <summary>
@@ -39,11 +33,15 @@ internal static uint LittleEndianToUInt32(byte[] buffer, int offset)
39
33
/// <returns>Converted <see cref="uint" />.</returns>
40
34
internal static uint LittleEndianToUInt32 ( byte [ ] buffer )
41
35
{
36
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
37
+ return BinaryPrimitives . ReadUInt32LittleEndian ( buffer ) ;
38
+ #else
42
39
uint n = buffer [ 0 ] ;
43
40
n |= ( uint ) buffer [ 1 ] << 8 ;
44
41
n |= ( uint ) buffer [ 2 ] << 16 ;
45
42
n |= ( uint ) buffer [ 3 ] << 24 ;
46
43
return n ;
44
+ #endif
47
45
}
48
46
49
47
/// <summary>
@@ -53,6 +51,9 @@ internal static uint LittleEndianToUInt32(byte[] buffer)
53
51
/// <returns>Converted <see cref="ulong" />.</returns>
54
52
internal static ulong LittleEndianToUInt64 ( byte [ ] buffer )
55
53
{
54
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
55
+ return BinaryPrimitives . ReadUInt64LittleEndian ( buffer ) ;
56
+ #else
56
57
ulong n = buffer [ 0 ] ;
57
58
n |= ( ulong ) buffer [ 1 ] << 8 ;
58
59
n |= ( ulong ) buffer [ 2 ] << 16 ;
@@ -62,6 +63,7 @@ internal static ulong LittleEndianToUInt64(byte[] buffer)
62
63
n |= ( ulong ) buffer [ 6 ] << 48 ;
63
64
n |= ( ulong ) buffer [ 7 ] << 56 ;
64
65
return n ;
66
+ #endif
65
67
}
66
68
67
69
/// <summary>
@@ -80,10 +82,14 @@ internal static byte[] UInt16ToLittleEndian(ushort value)
80
82
/// </summary>
81
83
/// <param name="value">The number to convert.</param>
82
84
/// <param name="buffer">The buffer.</param>
83
- internal static void UInt16ToLittleEndian ( ushort value , byte [ ] buffer )
85
+ private static void UInt16ToLittleEndian ( ushort value , byte [ ] buffer )
84
86
{
87
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
88
+ BinaryPrimitives . WriteUInt16LittleEndian ( buffer , value ) ;
89
+ #else
85
90
buffer [ 0 ] = ( byte ) ( value & 0x00FF ) ;
86
91
buffer [ 1 ] = ( byte ) ( ( value & 0xFF00 ) >> 8 ) ;
92
+ #endif
87
93
}
88
94
89
95
/// <summary>
@@ -102,26 +108,16 @@ internal static byte[] UInt32ToLittleEndian(uint value)
102
108
/// </summary>
103
109
/// <param name="value">The number to convert.</param>
104
110
/// <param name="buffer">The buffer.</param>
105
- internal static void UInt32ToLittleEndian ( uint value , byte [ ] buffer )
111
+ private static void UInt32ToLittleEndian ( uint value , byte [ ] buffer )
106
112
{
113
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
114
+ BinaryPrimitives . WriteUInt32LittleEndian ( buffer , value ) ;
115
+ #else
107
116
buffer [ 0 ] = ( byte ) ( value & 0x000000FF ) ;
108
117
buffer [ 1 ] = ( byte ) ( ( value & 0x0000FF00 ) >> 8 ) ;
109
118
buffer [ 2 ] = ( byte ) ( ( value & 0x00FF0000 ) >> 16 ) ;
110
119
buffer [ 3 ] = ( byte ) ( ( value & 0xFF000000 ) >> 24 ) ;
111
- }
112
-
113
- /// <summary>
114
- /// Populates buffer with little endian number representation.
115
- /// </summary>
116
- /// <param name="value">The number to convert.</param>
117
- /// <param name="buffer">The buffer.</param>
118
- /// <param name="offset">The buffer offset.</param>
119
- internal static void UInt32ToLittleEndian ( uint value , byte [ ] buffer , int offset )
120
- {
121
- buffer [ offset ] = ( byte ) ( value & 0x000000FF ) ;
122
- buffer [ offset + 1 ] = ( byte ) ( ( value & 0x0000FF00 ) >> 8 ) ;
123
- buffer [ offset + 2 ] = ( byte ) ( ( value & 0x00FF0000 ) >> 16 ) ;
124
- buffer [ offset + 3 ] = ( byte ) ( ( value & 0xFF000000 ) >> 24 ) ;
120
+ #endif
125
121
}
126
122
127
123
/// <summary>
@@ -140,8 +136,11 @@ internal static byte[] UInt64ToLittleEndian(ulong value)
140
136
/// </summary>
141
137
/// <param name="value">The number to convert.</param>
142
138
/// <param name="buffer">The buffer.</param>
143
- internal static void UInt64ToLittleEndian ( ulong value , byte [ ] buffer )
139
+ private static void UInt64ToLittleEndian ( ulong value , byte [ ] buffer )
144
140
{
141
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
142
+ BinaryPrimitives . WriteUInt64LittleEndian ( buffer , value ) ;
143
+ #else
145
144
buffer [ 0 ] = ( byte ) ( value & 0x00000000000000FF ) ;
146
145
buffer [ 1 ] = ( byte ) ( ( value & 0x000000000000FF00 ) >> 8 ) ;
147
146
buffer [ 2 ] = ( byte ) ( ( value & 0x0000000000FF0000 ) >> 16 ) ;
@@ -150,41 +149,41 @@ internal static void UInt64ToLittleEndian(ulong value, byte[] buffer)
150
149
buffer [ 5 ] = ( byte ) ( ( value & 0x0000FF0000000000 ) >> 40 ) ;
151
150
buffer [ 6 ] = ( byte ) ( ( value & 0x00FF000000000000 ) >> 48 ) ;
152
151
buffer [ 7 ] = ( byte ) ( ( value & 0xFF00000000000000 ) >> 56 ) ;
152
+ #endif
153
153
}
154
154
155
155
internal static byte [ ] UInt16ToBigEndian ( ushort value )
156
156
{
157
157
var buffer = new byte [ 2 ] ;
158
- UInt16ToBigEndian ( value , buffer ) ;
158
+ UInt16ToBigEndian ( value , buffer , offset : 0 ) ;
159
159
return buffer ;
160
160
}
161
161
162
- internal static void UInt16ToBigEndian ( ushort value , byte [ ] buffer )
163
- {
164
- buffer [ 0 ] = ( byte ) ( value >> 8 ) ;
165
- buffer [ 1 ] = ( byte ) ( value & 0x00FF ) ;
166
- }
167
-
168
162
internal static void UInt16ToBigEndian ( ushort value , byte [ ] buffer , int offset )
169
163
{
164
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
165
+ BinaryPrimitives . WriteUInt16BigEndian ( buffer . AsSpan ( offset ) , value ) ;
166
+ #else
170
167
buffer [ offset ] = ( byte ) ( value >> 8 ) ;
171
168
buffer [ offset + 1 ] = ( byte ) ( value & 0x00FF ) ;
169
+ #endif
172
170
}
173
171
174
172
internal static void UInt32ToBigEndian ( uint value , byte [ ] buffer )
175
173
{
176
- buffer [ 0 ] = ( byte ) ( ( value & 0xFF000000 ) >> 24 ) ;
177
- buffer [ 1 ] = ( byte ) ( ( value & 0x00FF0000 ) >> 16 ) ;
178
- buffer [ 2 ] = ( byte ) ( ( value & 0x0000FF00 ) >> 8 ) ;
179
- buffer [ 3 ] = ( byte ) ( value & 0x000000FF ) ;
174
+ UInt32ToBigEndian ( value , buffer , offset : 0 ) ;
180
175
}
181
176
182
177
internal static void UInt32ToBigEndian ( uint value , byte [ ] buffer , int offset )
183
178
{
179
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
180
+ BinaryPrimitives . WriteUInt32BigEndian ( buffer . AsSpan ( offset ) , value ) ;
181
+ #else
184
182
buffer [ offset ++ ] = ( byte ) ( ( value & 0xFF000000 ) >> 24 ) ;
185
183
buffer [ offset ++ ] = ( byte ) ( ( value & 0x00FF0000 ) >> 16 ) ;
186
184
buffer [ offset ++ ] = ( byte ) ( ( value & 0x0000FF00 ) >> 8 ) ;
187
185
buffer [ offset ] = ( byte ) ( value & 0x000000FF ) ;
186
+ #endif
188
187
}
189
188
190
189
internal static byte [ ] UInt32ToBigEndian ( uint value )
@@ -194,24 +193,27 @@ internal static byte[] UInt32ToBigEndian(uint value)
194
193
return buffer ;
195
194
}
196
195
197
- /// <summary>
198
- /// Returns the specified 64-bit unsigned integer value as an array of bytes.
199
- /// </summary>
200
- /// <param name="value">The number to convert.</param>
201
- /// <returns>An array of bytes with length 8.</returns>
202
196
internal static byte [ ] UInt64ToBigEndian ( ulong value )
203
197
{
204
- return new [ ]
205
- {
206
- ( byte ) ( ( value & 0xFF00000000000000 ) >> 56 ) ,
207
- ( byte ) ( ( value & 0x00FF000000000000 ) >> 48 ) ,
208
- ( byte ) ( ( value & 0x0000FF0000000000 ) >> 40 ) ,
209
- ( byte ) ( ( value & 0x000000FF00000000 ) >> 32 ) ,
210
- ( byte ) ( ( value & 0x00000000FF000000 ) >> 24 ) ,
211
- ( byte ) ( ( value & 0x0000000000FF0000 ) >> 16 ) ,
212
- ( byte ) ( ( value & 0x000000000000FF00 ) >> 8 ) ,
213
- ( byte ) ( value & 0x00000000000000FF )
214
- } ;
198
+ var buffer = new byte [ 8 ] ;
199
+ UInt64ToBigEndian ( value , buffer , offset : 0 ) ;
200
+ return buffer ;
201
+ }
202
+
203
+ private static void UInt64ToBigEndian ( ulong value , byte [ ] buffer , int offset )
204
+ {
205
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
206
+ BinaryPrimitives . WriteUInt64BigEndian ( buffer . AsSpan ( offset ) , value ) ;
207
+ #else
208
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0xFF00000000000000 ) >> 56 ) ;
209
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x00FF000000000000 ) >> 48 ) ;
210
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x0000FF0000000000 ) >> 40 ) ;
211
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x000000FF00000000 ) >> 32 ) ;
212
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x00000000FF000000 ) >> 24 ) ;
213
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x0000000000FF0000 ) >> 16 ) ;
214
+ buffer [ offset ++ ] = ( byte ) ( ( value & 0x000000000000FF00 ) >> 8 ) ;
215
+ buffer [ offset ] = ( byte ) ( value & 0x00000000000000FF ) ;
216
+ #endif
215
217
}
216
218
217
219
/// <summary>
@@ -221,7 +223,11 @@ internal static byte[] UInt64ToBigEndian(ulong value)
221
223
/// <returns>Converted <see cref="ushort" />.</returns>
222
224
internal static ushort BigEndianToUInt16 ( byte [ ] buffer )
223
225
{
226
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
227
+ return BinaryPrimitives . ReadUInt16BigEndian ( buffer ) ;
228
+ #else
224
229
return ( ushort ) ( buffer [ 0 ] << 8 | buffer [ 1 ] ) ;
230
+ #endif
225
231
}
226
232
227
233
/// <summary>
@@ -232,10 +238,14 @@ internal static ushort BigEndianToUInt16(byte[] buffer)
232
238
/// <returns>Converted <see cref="uint" />.</returns>
233
239
internal static uint BigEndianToUInt32 ( byte [ ] buffer , int offset )
234
240
{
241
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
242
+ return BinaryPrimitives . ReadUInt32BigEndian ( buffer . AsSpan ( offset ) ) ;
243
+ #else
235
244
return ( uint ) buffer [ offset + 0 ] << 24 |
236
245
( uint ) buffer [ offset + 1 ] << 16 |
237
246
( uint ) buffer [ offset + 2 ] << 8 |
238
247
buffer [ offset + 3 ] ;
248
+ #endif
239
249
}
240
250
241
251
/// <summary>
@@ -245,10 +255,7 @@ internal static uint BigEndianToUInt32(byte[] buffer, int offset)
245
255
/// <returns>Converted <see cref="uint" />.</returns>
246
256
internal static uint BigEndianToUInt32 ( byte [ ] buffer )
247
257
{
248
- return ( uint ) buffer [ 0 ] << 24 |
249
- ( uint ) buffer [ 1 ] << 16 |
250
- ( uint ) buffer [ 2 ] << 8 |
251
- buffer [ 3 ] ;
258
+ return BigEndianToUInt32 ( buffer , offset : 0 ) ;
252
259
}
253
260
254
261
/// <summary>
@@ -258,6 +265,9 @@ internal static uint BigEndianToUInt32(byte[] buffer)
258
265
/// <returns>Converted <see cref="ulong" />.</returns>
259
266
internal static ulong BigEndianToUInt64 ( byte [ ] buffer )
260
267
{
268
+ #if NETSTANDARD2_1_OR_GREATER || NET6_0_OR_GREATER
269
+ return BinaryPrimitives . ReadUInt64BigEndian ( buffer ) ;
270
+ #else
261
271
return ( ulong ) buffer [ 0 ] << 56 |
262
272
( ulong ) buffer [ 1 ] << 48 |
263
273
( ulong ) buffer [ 2 ] << 40 |
@@ -266,6 +276,7 @@ internal static ulong BigEndianToUInt64(byte[] buffer)
266
276
( ulong ) buffer [ 5 ] << 16 |
267
277
( ulong ) buffer [ 6 ] << 8 |
268
278
buffer [ 7 ] ;
279
+ #endif
269
280
}
270
281
}
271
282
}
0 commit comments