Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức BitConverter.ToDouble() trong C#

Phương thức BitConverter.ToDouble() trong C# được dùng để chuyển đổi 8 byte từ một mảng byte tại vị trí chỉ định thành một số thực double-precision (64-bit).

Cú pháp

public static double ToDouble(byte[] value, int startIndex);
  • value: Mảng byte nguồn.
  • startIndex: Vị trí bắt đầu (phải có ít nhất 8 byte từ vị trí này).

Trả về: Số double được hình thành từ 8 byte (theo endianness của hệ thống, thường little-endian).

Ví dụ 1: Mảng byte 17 phần tử, đọc 2 giá trị double

using System;

public class Demo
{
    public static void Main()
    {
        byte[] arr = { 0, 2, 5, 10, 20, 26, 34, 42, 50, 58, 66, 74, 82, 89, 97, 107, 115 };

        Console.WriteLine("Mảng byte = {0}", BitConverter.ToString(arr));

        // Đọc tại chỉ mục 1 và 9 (bước 8)
        for (int i = 1; i < arr.Length - 7; i = i + 8)
        {
            double values = BitConverter.ToDouble(arr, i);
            Console.WriteLine("\nGiá trị byte tại [" + i + "] = " + arr[i]);
            Console.WriteLine("Kết quả ToDouble = " + values);
        }
    }
}

Kết quả (ví dụ, phụ thuộc endianness)

Mảng byte = 00-02-05-0A-14-1A-22-2A-32-3A-42-4A-52-59-61-6B-73
Giá trị byte tại [1] = 2
Kết quả ToDouble = 4.84667324189914E-67
Giá trị byte tại [9] = 58
Kết quả ToDouble = 9.57203245252997E+247

Ví dụ 2: Mảng byte 9 phần tử, đọc 1 giá trị

using System;

public class Demo
{
    public static void Main()
    {
        byte[] arr = { 0, 3, 7, 10, 18, 20, 25, 26, 34 };

        Console.WriteLine("Mảng byte = {0}", BitConverter.ToString(arr));

        for (int i = 1; i < arr.Length - 7; i = i + 8)
        {
            double values = BitConverter.ToDouble(arr, i);
            Console.WriteLine("\nGiá trị byte tại [" + i + "] = " + arr[i]);
            Console.WriteLine("Kết quả ToDouble = " + values);
        }
    }
}

Kết quả

Mảng byte = 00-03-07-0A-12-14-19-1A-22
Giá trị byte tại [1] = 3
Kết quả ToDouble = 2.09001158167895E-144

Endianness và BitConverter

  • Trên hầu hết CPU (x86, x64, ARM): Little-Endian (byte thấp ở địa chỉ thấp).
  • BitConverter.IsLittleEndian cho biết endianness hiện tại.
  • Kết quả ToDouble sẽ khác nhau trên Big-Endian vs Little-Endian với cùng mảng byte.

Đối ngược: GetBytes(double)

double d = 3.14159;
byte[] bytes = BitConverter.GetBytes(d);
// Trên little-endian: bytes = { ... biểu diễn IEEE 754 của 3.14159 ... }

// Chuyển ngược
double d2 = BitConverter.ToDouble(bytes, 0);
// d2 == 3.14159

Các phương thức chuyển đổi BitConverter (tóm tắt)

Phương thức Byte Kiểu
ToBoolean 1 bool
ToChar / ToInt16 / ToUInt16 2 char / short / ushort
ToInt32 / ToUInt32 / ToSingle 4 int / uint / float
ToInt64 / ToUInt64 / ToDouble 8 long / ulong / double

Lưu ý

  • Ném ArgumentNullException nếu mảng null.
  • Ném ArgumentOutOfRangeException nếu startIndex không hợp lệ.
  • Dùng BinaryPrimitives.ReadDoubleLittleEndian/BigEndian (.NET Core 2.1+) để kiểm soát endianness tường minh.
  • Hữu ích khi đọc file binary, network protocol, interop với C/C++.