Add more Half methods to BitConverter (#41789)
authorHuo Yaoyuan <huoyaoyuan@hotmail.com>
Fri, 4 Sep 2020 23:46:59 +0000 (07:46 +0800)
committerGitHub <noreply@github.com>
Fri, 4 Sep 2020 23:46:59 +0000 (16:46 -0700)
* Add GetBytes, TryWriteBytes, ToHalf overloads for Half.

* Add ref source in System.Runtime.

* Add basic tests.

* Add array and span tests in BitConverter.

* Add xmldoc for BitConverter.GetBytes and TryWriteBytes.

* Add xmldoc for BitConverter.ToXXX.

* Add xmldoc for BitConverter.BitsTo.

src/libraries/System.Private.CoreLib/src/System/BitConverter.cs
src/libraries/System.Runtime.Extensions/tests/System/BitConverter.cs
src/libraries/System.Runtime.Extensions/tests/System/BitConverterArray.cs
src/libraries/System.Runtime.Extensions/tests/System/BitConverterBase.cs
src/libraries/System.Runtime.Extensions/tests/System/BitConverterSpan.cs
src/libraries/System.Runtime/ref/System.Runtime.cs

index bf842a2..356bf6c 100644 (file)
@@ -10,10 +10,9 @@ using Internal.Runtime.CompilerServices;
 
 namespace System
 {
-    // The BitConverter class contains methods for
-    // converting an array of bytes to one of the base data
-    // types, as well as for converting a base data type to an
-    // array of bytes.
+    /// <summary>
+    /// Converts base data types to an array of bytes, and an array of bytes to base data types.
+    /// </summary>
     public static class BitConverter
     {
         // This field indicates the "endianess" of the architecture.
@@ -27,7 +26,11 @@ namespace System
         public static readonly bool IsLittleEndian = true;
 #endif
 
-        // Converts a Boolean into an array of bytes with length one.
+        /// <summary>
+        /// Returns the specified Boolean value as a byte array.
+        /// </summary>
+        /// <param name="value">A Boolean value.</param>
+        /// <returns>A byte array with length 1.</returns>
         public static byte[] GetBytes(bool value)
         {
             byte[] r = new byte[1];
@@ -35,7 +38,12 @@ namespace System
             return r;
         }
 
-        // Converts a Boolean into a Span of bytes with length one.
+        /// <summary>
+        /// Converts a Boolean into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted Boolean.</param>
+        /// <param name="value">The Boolean to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, bool value)
         {
             if (destination.Length < sizeof(byte))
@@ -45,7 +53,11 @@ namespace System
             return true;
         }
 
-        // Converts a char into an array of bytes with length two.
+        /// <summary>
+        /// Returns the specified Unicode character value as a byte array.
+        /// </summary>
+        /// <param name="value">A Char value.</param>
+        /// <returns>An array of bytes with length 2.</returns>
         public static byte[] GetBytes(char value)
         {
             byte[] bytes = new byte[sizeof(char)];
@@ -53,7 +65,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a char into a Span
+        /// <summary>
+        /// Converts a character into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted character.</param>
+        /// <param name="value">The character to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, char value)
         {
             if (destination.Length < sizeof(char))
@@ -63,8 +80,11 @@ namespace System
             return true;
         }
 
-        // Converts a short into an array of bytes with length
-        // two.
+        /// <summary>
+        /// Returns the specified 16-bit signed integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 2.</returns>
         public static byte[] GetBytes(short value)
         {
             byte[] bytes = new byte[sizeof(short)];
@@ -72,7 +92,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a short into a Span
+        /// <summary>
+        /// Converts a 16-bit signed integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 16-bit signed integer.</param>
+        /// <param name="value">The 16-bit signed integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, short value)
         {
             if (destination.Length < sizeof(short))
@@ -82,8 +107,11 @@ namespace System
             return true;
         }
 
-        // Converts an int into an array of bytes with length
-        // four.
+        /// <summary>
+        /// Returns the specified 32-bit signed integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 4.</returns>
         public static byte[] GetBytes(int value)
         {
             byte[] bytes = new byte[sizeof(int)];
@@ -91,7 +119,12 @@ namespace System
             return bytes;
         }
 
-        // Converts an int into a Span
+        /// <summary>
+        /// Converts a 32-bit signed integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 32-bit signed integer.</param>
+        /// <param name="value">The 32-bit signed integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, int value)
         {
             if (destination.Length < sizeof(int))
@@ -101,8 +134,11 @@ namespace System
             return true;
         }
 
-        // Converts a long into an array of bytes with length
-        // eight.
+        /// <summary>
+        /// Returns the specified 64-bit signed integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 8.</returns>
         public static byte[] GetBytes(long value)
         {
             byte[] bytes = new byte[sizeof(long)];
@@ -110,7 +146,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a long into a Span
+        /// <summary>
+        /// Converts a 64-bit signed integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 64-bit signed integer.</param>
+        /// <param name="value">The 64-bit signed integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, long value)
         {
             if (destination.Length < sizeof(long))
@@ -120,8 +161,11 @@ namespace System
             return true;
         }
 
-        // Converts an ushort into an array of bytes with
-        // length two.
+        /// <summary>
+        /// Returns the specified 16-bit unsigned integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 2.</returns>
         [CLSCompliant(false)]
         public static byte[] GetBytes(ushort value)
         {
@@ -130,7 +174,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a ushort into a Span
+        /// <summary>
+        /// Converts a 16-bit unsigned integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 16-bit unsigned integer.</param>
+        /// <param name="value">The 16-bit unsigned integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         [CLSCompliant(false)]
         public static bool TryWriteBytes(Span<byte> destination, ushort value)
         {
@@ -141,8 +190,11 @@ namespace System
             return true;
         }
 
-        // Converts an uint into an array of bytes with
-        // length four.
+        /// <summary>
+        /// Returns the specified 32-bit unsigned integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 4.</returns>
         [CLSCompliant(false)]
         public static byte[] GetBytes(uint value)
         {
@@ -151,7 +203,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a uint into a Span
+        /// <summary>
+        /// Converts a 32-bit unsigned integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 32-bit unsigned integer.</param>
+        /// <param name="value">The 32-bit unsigned integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         [CLSCompliant(false)]
         public static bool TryWriteBytes(Span<byte> destination, uint value)
         {
@@ -162,8 +219,11 @@ namespace System
             return true;
         }
 
-        // Converts an unsigned long into an array of bytes with
-        // length eight.
+        /// <summary>
+        /// Returns the specified 64-bit signed integer value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 8.</returns>
         [CLSCompliant(false)]
         public static byte[] GetBytes(ulong value)
         {
@@ -172,7 +232,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a ulong into a Span
+        /// <summary>
+        /// Converts a 64-bit unsigned integer into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted 64-bit unsigned integer.</param>
+        /// <param name="value">The 64-bit unsigned integer to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         [CLSCompliant(false)]
         public static bool TryWriteBytes(Span<byte> destination, ulong value)
         {
@@ -183,8 +248,38 @@ namespace System
             return true;
         }
 
-        // Converts a float into an array of bytes with length
-        // four.
+        /// <summary>
+        /// Returns the specified half-precision floating point value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 2.</returns>
+        public static unsafe byte[] GetBytes(Half value)
+        {
+            byte[] bytes = new byte[sizeof(Half)];
+            Unsafe.As<byte, Half>(ref bytes[0]) = value;
+            return bytes;
+        }
+
+        /// <summary>
+        /// Converts a half-precision floating-point value into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted half-precision floating-point value.</param>
+        /// <param name="value">The half-precision floating-point value to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
+        public static unsafe bool TryWriteBytes(Span<byte> destination, Half value)
+        {
+            if (destination.Length < sizeof(Half))
+                return false;
+
+            Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(destination), value);
+            return true;
+        }
+
+        /// <summary>
+        /// Returns the specified single-precision floating point value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 4.</returns>
         public static byte[] GetBytes(float value)
         {
             byte[] bytes = new byte[sizeof(float)];
@@ -192,7 +287,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a float into a Span
+        /// <summary>
+        /// Converts a single-precision floating-point value into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted single-precision floating-point value.</param>
+        /// <param name="value">The single-precision floating-point value to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, float value)
         {
             if (destination.Length < sizeof(float))
@@ -202,8 +302,11 @@ namespace System
             return true;
         }
 
-        // Converts a double into an array of bytes with length
-        // eight.
+        /// <summary>
+        /// Returns the specified double-precision floating point value as an array of bytes.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>An array of bytes with length 8.</returns>
         public static byte[] GetBytes(double value)
         {
             byte[] bytes = new byte[sizeof(double)];
@@ -211,7 +314,12 @@ namespace System
             return bytes;
         }
 
-        // Converts a double into a Span
+        /// <summary>
+        /// Converts a double-precision floating-point value into a span of bytes.
+        /// </summary>
+        /// <param name="destination">When this method returns, the bytes representing the converted double-precision floating-point value.</param>
+        /// <param name="value">The double-precision floating-point value to convert.</param>
+        /// <returns><see langword="true"/> if the conversion was successful; <see langword="false"/> otherwise.</returns>
         public static bool TryWriteBytes(Span<byte> destination, double value)
         {
             if (destination.Length < sizeof(double))
@@ -221,10 +329,23 @@ namespace System
             return true;
         }
 
-        // Converts an array of bytes into a char.
+        /// <summary>
+        /// Returns a Unicode character converted from two bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A character formed by two bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException"><paramref name="startIndex"/> equals the length of <paramref name="value"/> minus 1.</exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static char ToChar(byte[] value, int startIndex) => unchecked((char)ToInt16(value, startIndex));
 
-        // Converts a Span into a char
+        /// <summary>
+        /// Converts a read-only byte span into a character.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A character representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than the length of a <see cref="char"/>.</exception>
         public static char ToChar(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(char))
@@ -232,7 +353,15 @@ namespace System
             return Unsafe.ReadUnaligned<char>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into a short.
+        /// <summary>
+        /// Returns a 16-bit signed integer converted from two bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 16-bit signed integer formed by two bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException"><paramref name="startIndex"/> equals the length of <paramref name="value"/> minus 1.</exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static short ToInt16(byte[] value, int startIndex)
         {
             if (value == null)
@@ -245,7 +374,12 @@ namespace System
             return Unsafe.ReadUnaligned<short>(ref value[startIndex]);
         }
 
-        // Converts a Span into a short
+        /// <summary>
+        /// Converts a read-only byte span into a 16-bit signed integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 16-bit signed integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 2.</exception>
         public static short ToInt16(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(short))
@@ -253,7 +387,18 @@ namespace System
             return Unsafe.ReadUnaligned<short>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into an int.
+        /// <summary>
+        /// Returns a 32-bit signed integer converted from four bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 32-bit signed integer formed by four bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 3,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static int ToInt32(byte[] value, int startIndex)
         {
             if (value == null)
@@ -266,7 +411,12 @@ namespace System
             return Unsafe.ReadUnaligned<int>(ref value[startIndex]);
         }
 
-        // Converts a Span into an int
+        /// <summary>
+        /// Converts a read-only byte span into a 32-bit signed integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 32-bit signed integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 4.</exception>
         public static int ToInt32(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(int))
@@ -274,7 +424,18 @@ namespace System
             return Unsafe.ReadUnaligned<int>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into a long.
+        /// <summary>
+        /// Returns a 64-bit signed integer converted from eight bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 64-bit signed integer formed by eight bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 7,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static long ToInt64(byte[] value, int startIndex)
         {
             if (value == null)
@@ -287,7 +448,12 @@ namespace System
             return Unsafe.ReadUnaligned<long>(ref value[startIndex]);
         }
 
-        // Converts a Span into a long
+        /// <summary>
+        /// Converts a read-only byte span into a 64-bit signed integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 64-bit signed integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 8.</exception>
         public static long ToInt64(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(long))
@@ -295,12 +461,24 @@ namespace System
             return Unsafe.ReadUnaligned<long>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into an ushort.
-        //
+        /// <summary>
+        /// Returns a 16-bit unsigned integer converted from two bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 16-bit unsigned integer formed by two bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException"><paramref name="startIndex"/> equals the length of <paramref name="value"/> minus 1.</exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         [CLSCompliant(false)]
         public static ushort ToUInt16(byte[] value, int startIndex) => unchecked((ushort)ToInt16(value, startIndex));
 
-        // Converts a Span into a ushort
+        /// <summary>
+        /// Converts a read-only byte span into a 16-bit unsigned integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 16-bit unsigned integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 2.</exception>
         [CLSCompliant(false)]
         public static ushort ToUInt16(ReadOnlySpan<byte> value)
         {
@@ -309,12 +487,27 @@ namespace System
             return Unsafe.ReadUnaligned<ushort>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into an uint.
-        //
+        /// <summary>
+        /// Returns a 32-bit unsigned integer converted from four bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 32-bit unsigned integer formed by four bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 3,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         [CLSCompliant(false)]
         public static uint ToUInt32(byte[] value, int startIndex) => unchecked((uint)ToInt32(value, startIndex));
 
-        // Convert a Span into a uint
+        /// <summary>
+        /// Converts a read-only byte span into a 32-bit unsigned integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 32-bit unsigned integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 4.</exception>
         [CLSCompliant(false)]
         public static uint ToUInt32(ReadOnlySpan<byte> value)
         {
@@ -323,12 +516,27 @@ namespace System
             return Unsafe.ReadUnaligned<uint>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into an unsigned long.
-        //
+        /// <summary>
+        /// Returns a 64-bit unsigned integer converted from four bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A 64-bit unsigned integer formed by eight bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 7,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         [CLSCompliant(false)]
         public static ulong ToUInt64(byte[] value, int startIndex) => unchecked((ulong)ToInt64(value, startIndex));
 
-        // Converts a Span into an unsigned long
+        /// <summary>
+        /// Converts a read-only byte span into a 64-bit unsigned integer.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A 64-bit unsigned integer representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 8.</exception>
         [CLSCompliant(false)]
         public static ulong ToUInt64(ReadOnlySpan<byte> value)
         {
@@ -337,10 +545,50 @@ namespace System
             return Unsafe.ReadUnaligned<ulong>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into a float.
+        /// <summary>
+        /// Returns a half-precision floating point number converted from two bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A half-precision floating point number signed integer formed by two bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException"><paramref name="startIndex"/> equals the length of <paramref name="value"/> minus 1.</exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
+        public static Half ToHalf(byte[] value, int startIndex) => Int16BitsToHalf(ToInt16(value, startIndex));
+
+        /// <summary>
+        /// Converts a read-only byte span into a half-precision floating-point value.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A half-precision floating-point value representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 2.</exception>
+        public static unsafe Half ToHalf(ReadOnlySpan<byte> value)
+        {
+            if (value.Length < sizeof(Half))
+                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value);
+            return Unsafe.ReadUnaligned<Half>(ref MemoryMarshal.GetReference(value));
+        }
+
+        /// <summary>
+        /// Returns a single-precision floating point number converted from four bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A single-precision floating point number formed by four bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 3,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static float ToSingle(byte[] value, int startIndex) => Int32BitsToSingle(ToInt32(value, startIndex));
 
-        // Converts a Span into a float
+        /// <summary>
+        /// Converts a read-only byte span into a single-precision floating-point value.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A single-precision floating-point value representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 4.</exception>
         public static float ToSingle(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(float))
@@ -348,10 +596,26 @@ namespace System
             return Unsafe.ReadUnaligned<float>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into a double.
+        /// <summary>
+        /// Returns a double-precision floating point number converted from four bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A double-precision floating point number formed by eight bytes beginning at <paramref name="startIndex"/>.</returns>
+        /// <exception cref="ArgumentException">
+        /// <paramref name="startIndex"/> is greater than or equal to the length of <paramref name="value"/> minus 7,
+        /// and is less than or equal to the length of <paramref name="value"/> minus 1.
+        /// </exception>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static double ToDouble(byte[] value, int startIndex) => Int64BitsToDouble(ToInt64(value, startIndex));
 
-        // Converts a Span into a double
+        /// <summary>
+        /// Converts a read-only byte span into a double-precision floating-point value.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A double-precision floating-point value representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 8.</exception>
         public static double ToDouble(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(double))
@@ -359,7 +623,26 @@ namespace System
             return Unsafe.ReadUnaligned<double>(ref MemoryMarshal.GetReference(value));
         }
 
-        // Converts an array of bytes into a String.
+        /// <summary>
+        /// Converts the numeric value of each element of a specified array of bytes
+        /// to its equivalent hexadecimal string representation.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <param name="length">The number of array elements in <paramref name="value"/> to convert.</param>
+        /// <returns>A string of hexadecimal pairs separated by hyphens,
+        /// where each pair represents the corresponding element in a subarray of <paramref name="value"/>;
+        /// for example, "7F-2C-4A-00".</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is <see langword="null"/>.</exception>
+        /// <exception cref="ArgumentOutOfRangeException">
+        /// <paramref name="startIndex"/> or <paramref name="length"/> is less than zero.
+        /// <para>-or-</para>
+        /// <paramref name="startIndex"/> is greater than zero and is greater than or equal to the length of <paramref name="value"/>.
+        /// </exception>
+        /// <exception cref="ArgumentException">
+        /// The combination of <paramref name="startIndex"/> and <paramref name="length"/> does not specify a position within <paramref name="value"/>;
+        /// that is, the <paramref name="startIndex"/> parameter is greater than the length of <paramref name="value"/> minus the <paramref name="length"/> parameter.
+        /// </exception>
         public static string ToString(byte[] value, int startIndex, int length)
         {
             if (value == null)
@@ -403,7 +686,15 @@ namespace System
             });
         }
 
-        // Converts an array of bytes into a String.
+        /// <summary>
+        /// Converts the numeric value of each element of a specified array of bytes
+        /// to its equivalent hexadecimal string representation.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <returns>A string of hexadecimal pairs separated by hyphens,
+        /// where each pair represents the corresponding element in <paramref name="value"/>;
+        /// for example, "7F-2C-4A-00".</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is <see langword="null"/>.</exception>
         public static string ToString(byte[] value)
         {
             if (value == null)
@@ -411,7 +702,17 @@ namespace System
             return ToString(value, 0, value.Length);
         }
 
-        // Converts an array of bytes into a String.
+        /// <summary>
+        /// Converts the numeric value of each element of a specified array of bytes
+        /// to its equivalent hexadecimal string representation.
+        /// </summary>
+        /// <param name="value">An array of bytes.</param>
+        /// <param name="startIndex">The starting position within <paramref name="value"/>.</param>
+        /// <returns>A string of hexadecimal pairs separated by hyphens,
+        /// where each pair represents the corresponding element in a subarray of <paramref name="value"/>;
+        /// for example, "7F-2C-4A-00".</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is <see langword="null"/>.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static string ToString(byte[] value, int startIndex)
         {
             if (value == null)
@@ -419,15 +720,14 @@ namespace System
             return ToString(value, startIndex, value.Length - startIndex);
         }
 
-        /*==================================ToBoolean===================================
-        **Action:  Convert an array of bytes to a boolean value.  We treat this array
-        **         as if the first 4 bytes were an Int4 an operate on this value.
-        **Returns: True if the Int4 value of the first 4 bytes is non-zero.
-        **Arguments: value -- The byte array
-        **           startIndex -- The position within the array.
-        **Exceptions: See ToInt4.
-        ==============================================================================*/
-        // Converts an array of bytes into a boolean.
+        /// <summary>
+        /// Returns a Boolean value converted from two bytes at a specified position in a byte array.
+        /// </summary>
+        /// <param name="value">A byte array.</param>
+        /// <param name="startIndex">The index of the byte within <paramref name="value"/>.</param>
+        /// <returns><see langword="true"/> if the byte at <paramref name="startIndex"/> is nonzero; otherwise <see langword="false"/>.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="startIndex"/> is less than zero or greater than the length of <paramref name="value"/> minus 1.</exception>
         public static bool ToBoolean(byte[] value, int startIndex)
         {
             if (value == null)
@@ -440,6 +740,12 @@ namespace System
             return value[startIndex] != 0;
         }
 
+        /// <summary>
+        /// Converts a read-only byte span into a Boolean value.
+        /// </summary>
+        /// <param name="value">A read-only span containing the bytes to convert.</param>
+        /// <returns>A Boolean representing the converted bytes.</returns>
+        /// <exception cref="ArgumentOutOfRangeException">The length of <paramref name="value"/> is less than 1.</exception>
         public static bool ToBoolean(ReadOnlySpan<byte> value)
         {
             if (value.Length < sizeof(byte))
@@ -447,6 +753,11 @@ namespace System
             return Unsafe.ReadUnaligned<byte>(ref MemoryMarshal.GetReference(value)) != 0;
         }
 
+        /// <summary>
+        /// Converts the specified double-precision floating point number to a 64-bit signed integer.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A 64-bit signed integer whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe long DoubleToInt64Bits(double value)
         {
@@ -460,6 +771,11 @@ namespace System
             return *((long*)&value);
         }
 
+        /// <summary>
+        /// Converts the specified 64-bit signed integer to a double-precision floating point number.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A double-precision floating point number whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe double Int64BitsToDouble(long value)
         {
@@ -473,6 +789,11 @@ namespace System
             return *((double*)&value);
         }
 
+        /// <summary>
+        /// Converts the specified single-precision floating point number to a 32-bit signed integer.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A 32-bit signed integer whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe int SingleToInt32Bits(float value)
         {
@@ -486,6 +807,11 @@ namespace System
             return *((int*)&value);
         }
 
+        /// <summary>
+        /// Converts the specified 32-bit signed integer to a single-precision floating point number.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A single-precision floating point number whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe float Int32BitsToSingle(int value)
         {
@@ -499,12 +825,22 @@ namespace System
             return *((float*)&value);
         }
 
+        /// <summary>
+        /// Converts the specified half-precision floating point number to a 16-bit signed integer.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A 16-bit signed integer whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe short HalfToInt16Bits(Half value)
         {
             return *((short*)&value);
         }
 
+        /// <summary>
+        /// Converts the specified 16-bit signed integer to a half-precision floating point number.
+        /// </summary>
+        /// <param name="value">The number to convert.</param>
+        /// <returns>A half-precision floating point number whose bits are identical to <paramref name="value"/>.</returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static unsafe Half Int16BitsToHalf(short value)
         {
index 848e80e..bfc9d69 100644 (file)
@@ -22,6 +22,7 @@ namespace System.Tests
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToBoolean(null, 0));
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToChar(null, 0));
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToDouble(null, 0));
+            AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToHalf(null, 0));
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToInt16(null, 0));
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToInt32(null, 0));
             AssertExtensions.Throws<ArgumentNullException>("value", () => BitConverter.ToInt64(null, 0));
@@ -49,6 +50,10 @@ namespace System.Tests
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToDouble(new byte[8], 8));
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToDouble(new byte[8], 9));
 
+            AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToHalf(new byte[2], -1));
+            AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToHalf(new byte[2], 2));
+            AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToHalf(new byte[2], 3));
+
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToInt16(new byte[2], -1));
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToInt16(new byte[2], 2));
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToInt16(new byte[2], 3));
@@ -94,6 +99,7 @@ namespace System.Tests
             AssertExtensions.Throws<ArgumentOutOfRangeException>("startIndex", () => BitConverter.ToBoolean(new byte[0], 0));
             AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToChar(new byte[2], 1));
             AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToDouble(new byte[8], 1));
+            AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToHalf(new byte[2], 1));
             AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToInt16(new byte[2], 1));
             AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToInt32(new byte[4], 1));
             AssertExtensions.Throws<ArgumentException>("value", null, () => BitConverter.ToInt64(new byte[8], 1));
@@ -153,6 +159,14 @@ namespace System.Tests
         }
 
         [Fact]
+        public static void RoundtripHalf()
+        {
+            Half input = (Half)123.44;
+            byte[] expected = { 0xb7, 0x57 };
+            VerifyRoundtrip(BitConverter.GetBytes, BitConverter.ToHalf, input, expected);
+        }
+
+        [Fact]
         public static void RoundtripInt16()
         {
             short input = 0x1234;
index ccffe6b..69120ed 100644 (file)
@@ -47,6 +47,11 @@ namespace System.Tests
             Assert.Equal(expected, BitConverter.GetBytes(num));
         }
 
+        public override void ConvertFromHalf(Half num, byte[] expected)
+        {
+            Assert.Equal(expected, BitConverter.GetBytes(num));
+        }
+
         public override void ConvertFromFloat(float num, byte[] expected)
         {
             Assert.Equal(expected, BitConverter.GetBytes(num));
@@ -92,6 +97,11 @@ namespace System.Tests
             Assert.Equal(expected, BitConverter.ToUInt64(byteArray, index));
         }
 
+        public override void ToHalf(int index, Half expected, byte[] byteArray)
+        {
+            Assert.Equal(expected, BitConverter.ToHalf(byteArray, index));
+        }
+
         public override void ToSingle(int index, float expected, byte[] byteArray)
         {
             Assert.Equal(expected, BitConverter.ToSingle(byteArray, index));
index 5f68a0b..4fe8177 100644 (file)
@@ -96,6 +96,22 @@ namespace System.Tests
         [InlineData(ulong.MaxValue, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF })]
         public abstract void ConvertFromULong(ulong num, byte[] expected);
 
+        public static IEnumerable<object[]> ConvertFromHalfTestData()
+        {
+            yield return new object[] { (Half)0.0, new byte[] { 0x00, 0x00 } };
+            yield return new object[] { (Half)123.44, new byte[] { 0xB7, 0x57 } };
+            yield return new object[] { Half.MinValue, new byte[] { 0xFF, 0xFB } };
+            yield return new object[] { Half.MaxValue, new byte[] { 0xFF, 0x7B } };
+            yield return new object[] { Half.Epsilon, new byte[] { 0x01, 0x00 } };
+            yield return new object[] { Half.NaN, new byte[] { 0x00, 0xFE } };
+            yield return new object[] { Half.PositiveInfinity, new byte[] { 0x00, 0x7C } };
+            yield return new object[] { Half.NegativeInfinity, new byte[] { 0x00, 0xFC } };
+        }
+
+        [Theory]
+        [MemberData(nameof(ConvertFromHalfTestData))]
+        public abstract void ConvertFromHalf(Half num, byte[] expected);
+
         [Theory]
         [InlineData(0.0F, new byte[] { 0x00, 0x00, 0x00, 0x00 })]
         [InlineData(1.0F, new byte[] { 0x00, 0x00, 0x80, 0x3F })]
@@ -140,7 +156,7 @@ namespace System.Tests
 
         public static IEnumerable<object[]> ToCharTestData()
         {
-            yield return new object[] { 0, ' ', s_toCharByteArray};
+            yield return new object[] { 0, ' ', s_toCharByteArray };
             yield return new object[] { 1, '\0', s_toCharByteArray };
             yield return new object[] { 3, '*', s_toCharByteArray };
             yield return new object[] { 5, 'A', s_toCharByteArray };
@@ -261,6 +277,25 @@ namespace System.Tests
         [MemberData(nameof(ToUInt64TestData))]
         public abstract void ToUInt64(int index, ulong expected, byte[] byteArray);
 
+        private static byte[] s_toHalfByteArray =
+            { 0x00, 0x00, 0xB7, 0x57, 0xFF, 0xFB, 0xFF, 0x7B, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0xFC };
+
+        public static IEnumerable<object[]> ToHalfTestData()
+        {
+            yield return new object[] { 0, (Half)0.0, s_toHalfByteArray };
+            yield return new object[] { 2, (Half)123.44, s_toHalfByteArray };
+            yield return new object[] { 4, Half.MinValue, s_toHalfByteArray };
+            yield return new object[] { 6, Half.MaxValue, s_toHalfByteArray };
+            yield return new object[] { 8, Half.Epsilon, s_toHalfByteArray };
+            yield return new object[] { 10, Half.NaN, s_toHalfByteArray };
+            yield return new object[] { 12, Half.PositiveInfinity, s_toHalfByteArray };
+            yield return new object[] { 14, Half.NegativeInfinity, s_toHalfByteArray };
+        }
+
+        [Theory]
+        [MemberData(nameof(ToHalfTestData))]
+        public abstract void ToHalf(int index, Half expected, byte[] byteArray);
+
         private static byte[] s_toSingleByteArray =
             { 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x70, 0x41, 0x00, 0xFF, 0x7F, 0x47, 0x00, 0x00, 0x80, 0x3B, 0x00, 0x00,
             0x80, 0x2F, 0x49, 0x46, 0x83, 0x05, 0x4B, 0x06, 0x9E, 0x3F, 0x4D, 0x06, 0x9E, 0x3F, 0x50, 0x06, 0x9E, 0x3F, 0x1E, 0x37,
index 70327ae..c527a5a 100644 (file)
@@ -93,6 +93,13 @@ namespace System.Tests
             Assert.Equal(expected, span.ToArray());
         }
 
+        public override void ConvertFromHalf(Half num, byte[] expected)
+        {
+            Span<byte> span = new Span<byte>(new byte[2]);
+            Assert.True(BitConverter.TryWriteBytes(span, num));
+            Assert.Equal(expected, span.ToArray());
+        }
+
         public override void ConvertFromFloat(float num, byte[] expected)
         {
             Span<byte> span = new Span<byte>(new byte[4]);
@@ -150,6 +157,12 @@ namespace System.Tests
             Assert.Equal(expected, BitConverter.ToUInt64(span.Slice(index)));
         }
 
+        public override void ToHalf(int index, Half expected, byte[] byteArray)
+        {
+            ReadOnlySpan<byte> span = new ReadOnlySpan<byte>(byteArray);
+            Assert.Equal(expected, BitConverter.ToHalf(span.Slice(index)));
+        }
+
         public override void ToSingle(int index, float expected, byte[] byteArray)
         {
             ReadOnlySpan<byte> span = new ReadOnlySpan<byte>(byteArray);
index 316db78..43d7e04 100644 (file)
@@ -574,6 +574,7 @@ namespace System
         public static byte[] GetBytes(bool value) { throw null; }
         public static byte[] GetBytes(char value) { throw null; }
         public static byte[] GetBytes(double value) { throw null; }
+        public static byte[] GetBytes(System.Half value) { throw null; }
         public static byte[] GetBytes(short value) { throw null; }
         public static byte[] GetBytes(int value) { throw null; }
         public static byte[] GetBytes(long value) { throw null; }
@@ -595,6 +596,8 @@ namespace System
         public static char ToChar(System.ReadOnlySpan<byte> value) { throw null; }
         public static double ToDouble(byte[] value, int startIndex) { throw null; }
         public static double ToDouble(System.ReadOnlySpan<byte> value) { throw null; }
+        public static System.Half ToHalf(byte[] value, int startIndex) { throw null; }
+        public static System.Half ToHalf(System.ReadOnlySpan<byte> value) { throw null; }
         public static short ToInt16(byte[] value, int startIndex) { throw null; }
         public static short ToInt16(System.ReadOnlySpan<byte> value) { throw null; }
         public static int ToInt32(byte[] value, int startIndex) { throw null; }
@@ -621,6 +624,7 @@ namespace System
         public static bool TryWriteBytes(System.Span<byte> destination, bool value) { throw null; }
         public static bool TryWriteBytes(System.Span<byte> destination, char value) { throw null; }
         public static bool TryWriteBytes(System.Span<byte> destination, double value) { throw null; }
+        public static bool TryWriteBytes(System.Span<byte> destination, System.Half value) { throw null; }
         public static bool TryWriteBytes(System.Span<byte> destination, short value) { throw null; }
         public static bool TryWriteBytes(System.Span<byte> destination, int value) { throw null; }
         public static bool TryWriteBytes(System.Span<byte> destination, long value) { throw null; }