diff --git a/src/ImageSharp/IO/BigEndianBitConverter.cs b/src/ImageSharp/IO/BigEndianBitConverter.cs index 2fcfd966c3..a9a713e1a7 100644 --- a/src/ImageSharp/IO/BigEndianBitConverter.cs +++ b/src/ImageSharp/IO/BigEndianBitConverter.cs @@ -1,6 +1,9 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; +using System.Buffers.Binary; + namespace SixLabors.ImageSharp.IO { /// @@ -58,27 +61,19 @@ namespace SixLabors.ImageSharp.IO /// public override short ToInt16(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 2); - - return (short)((value[startIndex] << 8) | value[startIndex + 1]); + return BinaryPrimitives.ReadInt16BigEndian(value.AsReadOnlySpan().Slice(startIndex)); } /// public override int ToInt32(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 4); - - return (value[startIndex] << 24) | (value[startIndex + 1] << 16) | (value[startIndex + 2] << 8) | value[startIndex + 3]; + return BinaryPrimitives.ReadInt32BigEndian(value.AsReadOnlySpan().Slice(startIndex)); } /// public override long ToInt64(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 8); - - long p1 = (value[startIndex] << 24) | (value[startIndex + 1] << 16) | (value[startIndex + 2] << 8) | value[startIndex + 3]; - long p2 = (value[startIndex + 4] << 24) | (value[startIndex + 5] << 16) | (value[startIndex + 6] << 8) | value[startIndex + 7]; - return (p2 & 0xFFFFFFFF) | (p1 << 32); + return BinaryPrimitives.ReadInt64BigEndian(value.AsReadOnlySpan().Slice(startIndex)); } } } \ No newline at end of file diff --git a/src/ImageSharp/IO/LittleEndianBitConverter.cs b/src/ImageSharp/IO/LittleEndianBitConverter.cs index a69831586a..b9db34f902 100644 --- a/src/ImageSharp/IO/LittleEndianBitConverter.cs +++ b/src/ImageSharp/IO/LittleEndianBitConverter.cs @@ -1,6 +1,9 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; +using System.Buffers.Binary; + namespace SixLabors.ImageSharp.IO { /// @@ -56,26 +59,21 @@ namespace SixLabors.ImageSharp.IO } /// - public unsafe override short ToInt16(byte[] value, int startIndex) + public override short ToInt16(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 2); - return (short)((value[startIndex + 1] << 8) | value[startIndex]); + return BinaryPrimitives.ReadInt16LittleEndian(value.AsReadOnlySpan().Slice(startIndex)); } /// - public unsafe override int ToInt32(byte[] value, int startIndex) + public override int ToInt32(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 4); - return (value[startIndex + 3] << 24) | (value[startIndex + 2] << 16) | (value[startIndex + 1] << 8) | value[startIndex]; + return BinaryPrimitives.ReadInt32LittleEndian(value.AsReadOnlySpan().Slice(startIndex)); } /// - public unsafe override long ToInt64(byte[] value, int startIndex) + public override long ToInt64(byte[] value, int startIndex) { - CheckByteArgument(value, startIndex, 8); - long p1 = (value[startIndex + 7] << 24) | (value[startIndex + 6] << 16) | (value[startIndex + 5] << 8) | value[startIndex + 4]; - long p2 = (value[startIndex + 3] << 24) | (value[startIndex + 2] << 16) | (value[startIndex + 1] << 8) | value[startIndex]; - return (p2 & 0xFFFFFFFF) | (p1 << 32); + return BinaryPrimitives.ReadInt64LittleEndian(value.AsReadOnlySpan().Slice(startIndex)); } } } \ No newline at end of file