BitConverter Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Преобразует базовые типы данных в массив байтов, а массив байтов — в базовые типы данных.
public ref class BitConverter abstract sealed
public ref class BitConverter sealed
public static class BitConverter
public sealed class BitConverter
type BitConverter = class
Public Class BitConverter
Public NotInheritable Class BitConverter
- Наследование
-
BitConverter
Примеры
В следующем примере кода показано использование нескольких BitConverter методов класса.
// Example of BitConverter class methods.
using namespace System;
int main()
{
String^ formatter = "{0,25}{1,30}";
double aDoubl = 0.1111111111111111111;
float aSingl = 0.1111111111111111111F;
__int64 aLong = 1111111111111111111;
int anInt = 1111111111;
short aShort = 11111;
__wchar_t aChar = L'*';
bool aBool = true;
Console::WriteLine( "This example of methods of the BitConverter class"
"\ngenerates the following output.\n" );
Console::WriteLine( formatter, "argument", "byte array" );
Console::WriteLine( formatter, "--------", "----------" );
// Convert values to Byte arrays and display them.
Console::WriteLine( formatter, aDoubl, BitConverter::ToString( BitConverter::GetBytes( aDoubl ) ) );
Console::WriteLine( formatter, aSingl, BitConverter::ToString( BitConverter::GetBytes( aSingl ) ) );
Console::WriteLine( formatter, aLong, BitConverter::ToString( BitConverter::GetBytes( aLong ) ) );
Console::WriteLine( formatter, anInt, BitConverter::ToString( BitConverter::GetBytes( anInt ) ) );
Console::WriteLine( formatter, aShort, BitConverter::ToString( BitConverter::GetBytes( aShort ) ) );
Console::WriteLine( formatter, aChar, BitConverter::ToString( BitConverter::GetBytes( aChar ) ) );
Console::WriteLine( formatter, aBool, BitConverter::ToString( BitConverter::GetBytes( aBool ) ) );
}
/*
This example of methods of the BitConverter class
generates the following output.
argument byte array
-------- ----------
0.111111111111111 1C-C7-71-1C-C7-71-BC-3F
0.1111111 39-8E-E3-3D
1111111111111111111 C7-71-C4-2B-AB-75-6B-0F
1111111111 C7-35-3A-42
11111 67-2B
* 2A-00
True 01
*/
// Example of BitConverter class methods.
using System;
class BitConverterDemo
{
public static void Main( )
{
const string formatter = "{0,25}{1,30}";
double aDoubl = 0.1111111111111111111;
float aSingl = 0.1111111111111111111F;
long aLong = 1111111111111111111;
int anInt = 1111111111;
short aShort = 11111;
char aChar = '*';
bool aBool = true;
Console.WriteLine(
"This example of methods of the BitConverter class" +
"\ngenerates the following output.\n" );
Console.WriteLine( formatter, "argument", "byte array" );
Console.WriteLine( formatter, "--------", "----------" );
// Convert values to Byte arrays and display them.
Console.WriteLine( formatter, aDoubl,
BitConverter.ToString( BitConverter.GetBytes( aDoubl ) ) );
Console.WriteLine( formatter, aSingl,
BitConverter.ToString( BitConverter.GetBytes( aSingl ) ) );
Console.WriteLine( formatter, aLong,
BitConverter.ToString( BitConverter.GetBytes( aLong ) ) );
Console.WriteLine( formatter, anInt,
BitConverter.ToString( BitConverter.GetBytes( anInt ) ) );
Console.WriteLine( formatter, aShort,
BitConverter.ToString( BitConverter.GetBytes( aShort ) ) );
Console.WriteLine( formatter, aChar,
BitConverter.ToString( BitConverter.GetBytes( aChar ) ) );
Console.WriteLine( formatter, aBool,
BitConverter.ToString( BitConverter.GetBytes( aBool ) ) );
}
}
/*
This example of methods of the BitConverter class
generates the following output.
argument byte array
-------- ----------
0.111111111111111 1C-C7-71-1C-C7-71-BC-3F
0.1111111 39-8E-E3-3D
1111111111111111111 C7-71-C4-2B-AB-75-6B-0F
1111111111 C7-35-3A-42
11111 67-2B
* 2A-00
True 01
*/
open System
let print: obj -> obj -> unit = printfn "%25O%30O"
let aDoubl = 0.1111111111111111111
let aSingl = 0.1111111111111111111f
let aLong = 1111111111111111111L
let anInt = 1111111111
let aShort = 11111s
let aChar = '*'
let aBool = true
printfn "This example of methods of the BitConverter class\ngenerates the following output.\n"
print "argument" "byte array"
print "--------" "----------"
// Convert values to Byte arrays and display them.
print aDoubl (BitConverter.ToString(BitConverter.GetBytes aDoubl))
print aSingl (BitConverter.ToString(BitConverter.GetBytes aSingl))
print aLong (BitConverter.ToString(BitConverter.GetBytes aLong))
print anInt (BitConverter.ToString(BitConverter.GetBytes anInt))
print aShort (BitConverter.ToString(BitConverter.GetBytes aShort))
print aChar (BitConverter.ToString(BitConverter.GetBytes aChar))
print aBool (BitConverter.ToString(BitConverter.GetBytes aBool))
// This example of methods of the BitConverter class
// generates the following output.
//
// argument byte array
// -------- ----------
// 0.111111111111111 1C-C7-71-1C-C7-71-BC-3F
// 0.1111111 39-8E-E3-3D
// 1111111111111111111 C7-71-C4-2B-AB-75-6B-0F
// 1111111111 C7-35-3A-42
// 11111 67-2B
// * 2A-00
// True 01
' Example of BitConverter class methods.
Module BitConverterDemo
Sub Main( )
Const formatter As String = "{0,25}{1,30}"
Dim aDoubl As Double = 0.1111111111111111111
Dim aSingl As Single = 0.1111111111111111111
Dim aLong As Long = 1111111111111111111
Dim anInt As Integer = 1111111111
Dim aShort As Short = 11111
Dim aChar As Char = "*"c
Dim aBool As Boolean = True
Console.WriteLine( _
"This example of methods of the BitConverter class" & _
vbCrLf & "generates the following output." & vbCrLf )
Console.WriteLine( formatter, "argument", "Byte array" )
Console.WriteLine( formatter, "--------", "----------" )
' Convert values to Byte arrays and display them.
Console.WriteLine( formatter, aDoubl, _
BitConverter.ToString( BitConverter.GetBytes( aDoubl ) ) )
Console.WriteLine( formatter, aSingl, _
BitConverter.ToString( BitConverter.GetBytes( aSingl ) ) )
Console.WriteLine( formatter, aLong, _
BitConverter.ToString( BitConverter.GetBytes( aLong ) ) )
Console.WriteLine( formatter, anInt, _
BitConverter.ToString( BitConverter.GetBytes( anInt ) ) )
Console.WriteLine( formatter, aShort, _
BitConverter.ToString( BitConverter.GetBytes( aShort ) ) )
Console.WriteLine( formatter, aChar, _
BitConverter.ToString( BitConverter.GetBytes( aChar ) ) )
Console.WriteLine( formatter, aBool, _
BitConverter.ToString( BitConverter.GetBytes( aBool ) ) )
End Sub
End Module
' This example of methods of the BitConverter class
' generates the following output.
'
' argument Byte array
' -------- ----------
' 0.111111111111111 1C-C7-71-1C-C7-71-BC-3F
' 0.1111111 39-8E-E3-3D
' 1111111111111111111 C7-71-C4-2B-AB-75-6B-0F
' 1111111111 C7-35-3A-42
' 11111 67-2B
' * 2A-00
' True 01
Комментарии
Класс BitConverter помогает управлять типами значений в их фундаментальной форме в виде ряда байтов. Байт определяется как 8-разрядное целое число без знака. Класс BitConverter включает статические методы для преобразования каждого из примитивных типов в массив байтов и из них, как показано в следующей таблице.
Type | Преобразование байтов в байт | Из преобразования байтов |
---|---|---|
Boolean | GetBytes(Boolean) | ToBoolean |
Char | GetBytes(Char) | ToChar |
Double | GetBytes(Double) -или- DoubleToInt64Bits(Double) |
ToDouble -или- Int64BitsToDouble |
Int16 | GetBytes(Int16) | ToInt16 |
Int32 | GetBytes(Int32) | ToInt32 |
Int64 | GetBytes(Int64) | ToInt64 |
Single | GetBytes(Single) | ToSingle |
UInt16 | GetBytes(UInt16) | ToUInt16 |
UInt32 | GetBytes(UInt32) | ToUInt32 |
UInt64 | GetBytes(UInt64) | ToUInt64 |
Если вы используете BitConverter методы для передачи данных, убедитесь, что перегрузка GetBytes и To
метод Type указывают тот же тип. Как показано в следующем примере, восстановление массива, представляющего целое число со знаком путем вызова ToUInt32 метода, может привести к значению, отличному от исходного. Дополнительные сведения см. в разделе "Работа со знаком без десятичных и битовых значений".
using System;
public class Example
{
public static void Main()
{
int value = -16;
Byte[] bytes = BitConverter.GetBytes(value);
// Convert bytes back to int.
int intValue = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("{0} = {1}: {2}",
value, intValue,
value.Equals(intValue) ? "Round-trips" : "Does not round-trip");
// Convert bytes to UInt32.
uint uintValue = BitConverter.ToUInt32(bytes, 0);
Console.WriteLine("{0} = {1}: {2}", value, uintValue,
value.Equals(uintValue) ? "Round-trips" : "Does not round-trip");
}
}
// The example displays the following output:
// -16 = -16: Round-trips
// -16 = 4294967280: Does not round-trip
open System
let value = -16
let bytes = BitConverter.GetBytes value
// Convert bytes back to int.
let intValue = BitConverter.ToInt32(bytes, 0)
printfn $"""{value} = {intValue}: {if value.Equals intValue then "Round-trips" else "Does not round-trip"}"""
// Convert bytes to UInt32.
let uintValue = BitConverter.ToUInt32(bytes, 0)
printfn $"""{value} = {uintValue}: {if value.Equals uintValue then "Round-trips" else "Does not round-trip"}"""
// The example displays the following output:
// -16 = -16: Round-trips
// -16 = 4294967280: Does not round-trip
Module Example
Public Sub Main()
Dim value As Integer = -16
Dim bytes() As Byte = BitConverter.GetBytes(value)
' Convert bytes back to Int32.
Dim intValue As Integer = BitConverter.ToInt32(bytes, 0)
Console.WriteLine("{0} = {1}: {2}",
value, intValue,
If(value.Equals(intValue), "Round-trips", "Does not round-trip"))
' Convert bytes to UInt32.
Dim uintValue As UInteger = BitConverter.ToUInt32(bytes, 0)
Console.WriteLine("{0} = {1}: {2}", value, uintValue,
If(value.Equals(uintValue), "Round-trips", "Does not round-trip"))
End Sub
End Module
' The example displays the following output:
' -16 = -16: Round-trips
' -16 = 4294967280: Does not round-trip
Порядок байтов в массиве, возвращаемом GetBytes перегрузками метода (а также порядок битов в целочисленном значении, возвращаемом методом DoubleToInt64Bits , и порядок шестнадцатеричных строк, возвращаемых методом ToString(Byte[]) ), зависит от того, является ли архитектура компьютера малой или большой. Аналогичным образом порядок байтов в массиве и возвращается To
методами IntegerValue и ToChar методом зависит от того, является ли архитектура компьютера малой или большой. Конечная часть архитектуры обозначается свойством IsLittleEndian , которое возвращается true
в небольших системах и false
на больших системах. В небольших системах байты нижнего порядка предшествуют байтам более высокого порядка. В системе big-endian байты с более высоким порядком предшествуют байтам нижнего порядка. В следующей таблице показано различие в массивах байтов, которые приводят к передаче целочисленного числа 1 234 567 890 (0x499602D2) GetBytes(Int32) в метод. Байты перечислены в порядке от байта с индексом 0 до байта по индексу 3.
Маленький эндиан | D2-02-96-49 |
Большой эндиан | 49-96-02-D2 |
Так как возвращаемое значение некоторых методов зависит от системной архитектуры, будьте осторожны при передаче данных байтов за пределы компьютера:
Если все системы, отправляющие и получающие данные, гарантированно имеют одинаковую конечную возможность, то данные не выполняются.
Если системы, отправляющие и получающие данные, могут иметь различную конечную особенность, всегда передавать данные в определенном порядке. Это означает, что порядок байтов в массиве может быть отменен либо перед отправкой, либо после их получения. Общее соглашение заключается в передаче данных в сетевом байтовом порядке (порядок больших байтов). В следующем примере представлена реализация отправки целочисленного значения в порядке байтов сети.
using System; public class Example { public static void Main() { int value = 12345678; byte[] bytes = BitConverter.GetBytes(value); Console.WriteLine(BitConverter.ToString(bytes)); if (BitConverter.IsLittleEndian) Array.Reverse(bytes); Console.WriteLine(BitConverter.ToString(bytes)); // Call method to send byte stream across machine boundaries. // Receive byte stream from beyond machine boundaries. Console.WriteLine(BitConverter.ToString(bytes)); if (BitConverter.IsLittleEndian) Array.Reverse(bytes); Console.WriteLine(BitConverter.ToString(bytes)); int result = BitConverter.ToInt32(bytes, 0); Console.WriteLine("Original value: {0}", value); Console.WriteLine("Returned value: {0}", result); } } // The example displays the following output on a little-endian system: // 4E-61-BC-00 // 00-BC-61-4E // 00-BC-61-4E // 4E-61-BC-00 // Original value: 12345678 // Returned value: 12345678
open System let value = 12345678 let bytes = BitConverter.GetBytes value printfn $"{BitConverter.ToString bytes}" if BitConverter.IsLittleEndian then Array.Reverse bytes printfn $"{BitConverter.ToString bytes}" // Call method to send byte stream across machine boundaries. // Receive byte stream from beyond machine boundaries. printfn $"{BitConverter.ToString bytes}" if BitConverter.IsLittleEndian then Array.Reverse bytes printfn $"{BitConverter.ToString bytes}" let result = BitConverter.ToInt32(bytes, 0) printfn $"Original value: {value}" printfn $"Returned value: {result}" // The example displays the following output on a little-endian system: // 4E-61-BC-00 // 00-BC-61-4E // 00-BC-61-4E // 4E-61-BC-00 // Original value: 12345678 // Returned value: 12345678
Module Example Public Sub Main() Dim value As Integer = 12345678 Dim bytes() As Byte = BitConverter.GetBytes(value) Console.WriteLine(BitConverter.ToString(bytes)) If BitConverter.IsLittleEndian Then Array.Reverse(bytes) End If Console.WriteLine(BitConverter.ToString(bytes)) ' Call method to send byte stream across machine boundaries. ' Receive byte stream from beyond machine boundaries. Console.WriteLine(BitConverter.ToString(bytes)) If BitConverter.IsLittleEndian Then Array.Reverse(bytes) End If Console.WriteLine(BitConverter.ToString(bytes)) Dim result As Integer = BitConverter.ToInt32(bytes, 0) Console.WriteLine("Original value: {0}", value) Console.WriteLine("Returned value: {0}", result) End Sub End Module ' The example displays the following output on a little-endian system: ' 4E-61-BC-00 ' 00-BC-61-4E ' 00-BC-61-4E ' 4E-61-BC-00 ' Original value: 12345678 ' Returned value: 12345678
Если системы, отправляющие и получающие данные, могут иметь различную конечную часть, а передаваемые данные состоят из целых чисел со знаком, вызовите IPAddress.HostToNetworkOrder метод для преобразования данных в сетевой порядок байтов и IPAddress.NetworkToHostOrder метод для преобразования их в порядок, необходимый получателю.
Поля
IsLittleEndian |
Указывает порядок байтов (порядок следования байтов), по которому данные сохраняются в архитектуре этого компьютера. |
Методы
DoubleToInt64Bits(Double) |
Преобразует указанное число двойной точности с плавающей запятой в 64-битовое целое число со знаком. |
DoubleToUInt64Bits(Double) |
Преобразует указанное число с плавающей запятой двойной точности в 64-разрядное целое число без знака. |
GetBytes(Boolean) |
Возвращает указанное логическое значение в виде массива байтов. |
GetBytes(Char) |
Возвращает указанное значение знака Юникода в виде массива байтов. |
GetBytes(Double) |
Возвращает указанное значение с плавающей запятой двойной точности в виде массива байтов. |
GetBytes(Half) |
Возвращает указанное значение с плавающей запятой половины точности в виде массива байтов. |
GetBytes(Int16) |
Возвращает указанное значение 16-битового целого числа со знаком в виде массива байтов. |
GetBytes(Int32) |
Возвращает указанное 32-разрядное целое число со знаком в качестве массива байтов. |
GetBytes(Int64) |
Возвращает указанное 64-разрядные целые числа со знаком в качестве массива байтов. |
GetBytes(Single) |
Возвращает указанное значение с плавающей запятой с обычной точностью в виде массива байтов. |
GetBytes(UInt16) |
Возвращает указанное значение 16-битового целого числа без знака в виде массива байтов. |
GetBytes(UInt32) |
Возвращает указанное 32-разрядное целое число без знака в виде массива байтов. |
GetBytes(UInt64) |
Возвращает указанное 64-разрядное целое число без знака в виде массива байтов. |
HalfToInt16Bits(Half) |
Преобразует значение с плавающей запятой половины точности в 16-разрядное целое число. |
HalfToUInt16Bits(Half) |
Преобразует указанное число с плавающей запятой половины точности в 16-разрядное целое число без знака. |
Int16BitsToHalf(Int16) |
Повторно интерпретирует указанное 16-разрядное целое число со знаком как значение с плавающей запятой половинной точности. |
Int32BitsToSingle(Int32) |
Повторно интерпретирует указанное 32-разрядное целое число как значение одиночной точности с плавающей запятой. |
Int64BitsToDouble(Int64) |
Повторно интерпретирует указанное 64-битовое целое число со знаком в число двойной точности с плавающей запятой. |
SingleToInt32Bits(Single) |
Преобразует значение одиночной точности с плавающей запятой в целое число. |
SingleToUInt32Bits(Single) |
Преобразует указанное число с плавающей запятой с одной точностью в 32-разрядное целое число без знака. |
ToBoolean(Byte[], Int32) |
Возвращает логическое значение, преобразованное из байта в указанной позиции в массиве байтов. |
ToBoolean(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон в логическое значение. |
ToChar(Byte[], Int32) |
Возвращает знак Юникода, преобразованный из двух байтов с указанной позицией в массив байтов. |
ToChar(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон в символ. |
ToDouble(Byte[], Int32) |
Возвращает число двойной точности с плавающей запятой, преобразованное из восьми байтов с указанной позицией в массив байтов. |
ToDouble(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в значение двойной точности с плавающей запятой. |
ToHalf(Byte[], Int32) |
Возвращает число с плавающей запятой laft-precision, преобразованное из двух байтов в указанной позиции в массиве байтов. |
ToHalf(ReadOnlySpan<Byte>) |
Преобразует диапазон байтов только для чтения в значение с плавающей запятой половины точности. |
ToInt16(Byte[], Int32) |
Возвращает 16-битовое целое число со знаком, преобразованное из двух байтов с указанной позицией в массив байтов. |
ToInt16(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в 16-разрядное целое число со знаком. |
ToInt32(Byte[], Int32) |
Возвращает 32-битовое целое число со знаком, преобразованное из четырех байтов с указанной позицией в массив байтов. |
ToInt32(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в 32-разрядное целое число со знаком. |
ToInt64(Byte[], Int32) |
Возвращает 64-битовое целое число со знаком, преобразованное из восьми байт с указанной позицией в массив байтов. |
ToInt64(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в 64-разрядное целое число со знаком. |
ToSingle(Byte[], Int32) |
Возвращает число одинарной точности с плавающей запятой, преобразованное из четырех байтов с указанной позицией в массив байтов. |
ToSingle(ReadOnlySpan<Byte>) |
Преобразует диапазон байтов только для чтения в значение с плавающей запятой с одной точностью. |
ToString(Byte[]) |
Преобразует числовое значение каждого элемента заданного массива байтов в эквивалентное ему шестнадцатеричное строковое представление. |
ToString(Byte[], Int32) |
Преобразует числовое значение каждого элемента заданного подмассива байтов в эквивалентное ему шестнадцатеричное строковое представление. |
ToString(Byte[], Int32, Int32) |
Преобразует числовое значение каждого элемента заданного подмассива байтов в эквивалентное ему шестнадцатеричное строковое представление. |
ToUInt16(Byte[], Int32) |
Возвращает 16-битовое целое число без знака, преобразованное из двух байтов с указанной позицией в массив байтов. |
ToUInt16(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в 16-разрядное целое число без знака. |
ToUInt32(Byte[], Int32) |
Возвращает 32-битовое целое число без знака, преобразованное из четырех байтов с указанной позицией в массив байтов. |
ToUInt32(ReadOnlySpan<Byte>) |
Преобразует доступный только для чтения диапазон байтов в 32-разрядное целое число без знака. |
ToUInt64(Byte[], Int32) |
Возвращает 64-битовое целое число без знака, преобразованное из восьми байтов с указанной позицией в массив байтов. |
ToUInt64(ReadOnlySpan<Byte>) |
Преобразует байты в длинное целое число без знака. |
TryWriteBytes(Span<Byte>, Boolean) |
Преобразует логическое значение в диапазон байтов. |
TryWriteBytes(Span<Byte>, Char) |
Преобразует символ в диапазон байтов. |
TryWriteBytes(Span<Byte>, Double) |
Преобразует значение двойной точности с плавающей запятой в диапазон байтов. |
TryWriteBytes(Span<Byte>, Half) |
Преобразует значение с плавающей запятой половинной точности в диапазон байтов. |
TryWriteBytes(Span<Byte>, Int16) |
Преобразует 16-разрядное целое число со знаком в диапазон байтов. |
TryWriteBytes(Span<Byte>, Int32) |
Преобразует 32-разрядное целое число со знаком в диапазон байтов. |
TryWriteBytes(Span<Byte>, Int64) |
Преобразует 64-разрядное целое число со знаком в диапазон байтов. |
TryWriteBytes(Span<Byte>, Single) |
Преобразует значение с плавающей запятой с одной точностью в диапазон байтов. |
TryWriteBytes(Span<Byte>, UInt16) |
Преобразует 16-разрядное целое число без знака в диапазон байтов. |
TryWriteBytes(Span<Byte>, UInt32) |
Преобразует 32-разрядное целое число без знака в диапазон байтов. |
TryWriteBytes(Span<Byte>, UInt64) |
Преобразует 64-разрядное целое число без знака в диапазон байтов. |
UInt16BitsToHalf(UInt16) |
Преобразует указанное 16-разрядное целое число без знака в число с плавающей запятой половинной точности. |
UInt32BitsToSingle(UInt32) |
Преобразует указанное 32-разрядное целое число без знака в число с плавающей запятой с одной точностью. |
UInt64BitsToDouble(UInt64) |
Преобразует указанное 64-разрядное целое число без знака в число с плавающей запятой двойной точности. |