@@ -18,6 +18,8 @@ internal static class ProtobufSerializer
18
18
private const ulong ULong128 = 0x80 ;
19
19
private const int Fixed32Size = 4 ;
20
20
private const int Fixed64Size = 8 ;
21
+ private const int MaskBitsLow = 0b_0111_1111 ;
22
+ private const int MaskBitHigh = 0b_1000_0000 ;
21
23
22
24
private static readonly Encoding Utf8Encoding = Encoding . UTF8 ;
23
25
@@ -42,63 +44,11 @@ internal static int WriteTagAndLength(byte[] buffer, int writePosition, int cont
42
44
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
43
45
internal static void WriteReservedLength ( byte [ ] buffer , int writePosition , int length )
44
46
{
45
- int byteLength = 0 ;
46
- int ? firstByte = null ;
47
- int ? secondByte = null ;
48
- int ? thirdByte = null ;
49
- int ? fourthByte = null ;
50
-
51
- do
52
- {
53
- switch ( byteLength )
54
- {
55
- case 0 :
56
- firstByte = length & 0x7F ;
57
- break ;
58
- case 1 :
59
- secondByte = length & 0x7F ;
60
- break ;
61
- case 2 :
62
- thirdByte = length & 0x7F ;
63
- break ;
64
- case 3 :
65
- fourthByte = length & 0x7F ;
66
- break ;
67
- }
68
-
69
- length >>= 7 ;
70
- byteLength ++ ;
71
- }
72
- while ( length > 0 ) ;
73
-
74
- if ( fourthByte . HasValue )
75
- {
76
- buffer [ writePosition ++ ] = ( byte ) ( firstByte ! . Value | 0x80 ) ;
77
- buffer [ writePosition ++ ] = ( byte ) ( secondByte ! . Value | 0x80 ) ;
78
- buffer [ writePosition ++ ] = ( byte ) ( thirdByte ! . Value | 0x80 ) ;
79
- buffer [ writePosition ++ ] = ( byte ) fourthByte ! . Value ;
80
- }
81
- else if ( thirdByte . HasValue )
82
- {
83
- buffer [ writePosition ++ ] = ( byte ) ( firstByte ! . Value | 0x80 ) ;
84
- buffer [ writePosition ++ ] = ( byte ) ( secondByte ! . Value | 0x80 ) ;
85
- buffer [ writePosition ++ ] = ( byte ) ( thirdByte ! . Value | 0x80 ) ;
86
- buffer [ writePosition ++ ] = 0 ;
87
- }
88
- else if ( secondByte . HasValue )
89
- {
90
- buffer [ writePosition ++ ] = ( byte ) ( firstByte ! . Value | 0x80 ) ;
91
- buffer [ writePosition ++ ] = ( byte ) ( secondByte ! . Value | 0x80 ) ;
92
- buffer [ writePosition ++ ] = 0x80 ;
93
- buffer [ writePosition ++ ] = 0 ;
94
- }
95
- else
96
- {
97
- buffer [ writePosition ++ ] = ( byte ) ( firstByte ! . Value | 0x80 ) ;
98
- buffer [ writePosition ++ ] = 0x80 ;
99
- buffer [ writePosition ++ ] = 0x80 ;
100
- buffer [ writePosition ++ ] = 0 ;
101
- }
47
+ var slice = buffer . AsSpan ( writePosition , 4 ) ;
48
+ slice [ 0 ] = ( byte ) ( ( length & MaskBitsLow ) | MaskBitHigh ) ;
49
+ slice [ 1 ] = ( byte ) ( ( ( length >> 7 ) & MaskBitsLow ) | MaskBitHigh ) ;
50
+ slice [ 2 ] = ( byte ) ( ( ( length >> 14 ) & MaskBitsLow ) | MaskBitHigh ) ;
51
+ slice [ 3 ] = ( byte ) ( ( length >> 21 ) & MaskBitsLow ) ;
102
52
}
103
53
104
54
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -171,7 +121,7 @@ internal static int WriteVarInt32(byte[] buffer, int writePosition, uint value)
171
121
{
172
122
while ( value >= UInt128 )
173
123
{
174
- buffer [ writePosition ++ ] = ( byte ) ( 0x80 | ( value & 0x7F ) ) ;
124
+ buffer [ writePosition ++ ] = ( byte ) ( MaskBitHigh | ( value & MaskBitsLow ) ) ;
175
125
value >>= 7 ;
176
126
}
177
127
@@ -184,7 +134,7 @@ internal static int WriteVarInt64(byte[] buffer, int writePosition, ulong value)
184
134
{
185
135
while ( value >= ULong128 )
186
136
{
187
- buffer [ writePosition ++ ] = ( byte ) ( 0x80 | ( value & 0x7F ) ) ;
137
+ buffer [ writePosition ++ ] = ( byte ) ( MaskBitHigh | ( value & MaskBitsLow ) ) ;
188
138
value >>= 7 ;
189
139
}
190
140
0 commit comments