@@ -105,7 +105,7 @@ public static Span<byte> Compress(ReadOnlySpan<byte> data, int level)
105105 }
106106 else
107107 {
108- Write24 ( dest , destPos , hash << 4 | ( matchlen << 16 ) ) ;
108+ Write24 ( destSpan , destPos , hash << 4 | ( matchlen << 16 ) ) ;
109109 destPos += 3 ;
110110 }
111111 sourcePos += matchlen ;
@@ -262,28 +262,30 @@ private static void WriteHeader(Span<byte> dest, int srcLen, int level, int head
262262 }
263263
264264 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
265- private static void Write24 ( byte [ ] outArr , int outOff , int value )
265+ private static void Write24 ( Span < byte > outArr , int outOff , int value )
266266 {
267- outArr [ outOff + 0 ] = unchecked ( ( byte ) ( value >> 00 ) ) ;
268- outArr [ outOff + 1 ] = unchecked ( ( byte ) ( value >> 08 ) ) ;
269- outArr [ outOff + 2 ] = unchecked ( ( byte ) ( value >> 16 ) ) ;
267+ var sli3 = outArr . Slice ( outOff , 3 ) ;
268+ BinaryPrimitives . WriteUInt16LittleEndian ( sli3 , unchecked ( ( ushort ) value ) ) ;
269+ sli3 [ 2 ] = unchecked ( ( byte ) ( value >> 16 ) ) ;
270270 }
271271
272272 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
273273 private static int Read24 ( ReadOnlySpan < byte > intArr , int inOff )
274- => unchecked ( intArr [ inOff ] | ( intArr [ inOff + 1 ] << 8 ) | ( intArr [ inOff + 2 ] << 16 ) ) ;
274+ {
275+ var sli3 = intArr . Slice ( inOff , 3 ) ;
276+ return unchecked ( BinaryPrimitives . ReadUInt16LittleEndian ( sli3 ) | ( sli3 [ 2 ] << 16 ) ) ;
277+ }
275278
276279 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
277280 private static int Hash ( int value ) => ( ( value >> 12 ) ^ value ) & 0xfff ;
278281
279282 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
280283 private static bool Is6Same ( ReadOnlySpan < byte > arr )
281284 {
282- return arr [ 0 ] == arr [ 1 ]
283- && arr [ 1 ] == arr [ 2 ]
284- && arr [ 2 ] == arr [ 3 ]
285- && arr [ 3 ] == arr [ 4 ]
286- && arr [ 4 ] == arr [ 5 ] ;
285+ var sli6 = arr . Slice ( 0 , 6 ) ;
286+ var i0 = BinaryPrimitives . ReadUInt32LittleEndian ( sli6 ) ;
287+ var u1 = BinaryPrimitives . ReadUInt16LittleEndian ( sli6 . Slice ( 4 ) ) ;
288+ return i0 == i0 >> 8 && unchecked ( ( ushort ) i0 ) == u1 ;
287289 }
288290
289291 /// <summary>Copy <code>[start; start + length)</code> bytes from `data` to the end of `data`</summary>
0 commit comments