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.IsLittleEndiancho biết endianness hiện tại.- Kết quả
ToDoublesẽ 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
ArgumentNullExceptionnếu mảng null. - Ném
ArgumentOutOfRangeExceptionnếustartIndexkhô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++.