BitConverter Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Converte tipos de dados base para um array de bytes, e um array de bytes para tipos de dados base.
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
- Herança
-
BitConverter
Exemplos
O exemplo de código seguinte ilustra a utilização de vários BitConverter métodos de classes.
// 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
Observações
A BitConverter classe ajuda a manipular tipos de valor na sua forma fundamental, como uma série de bytes. Um byte é definido como um inteiro sem sinal de 8 bits. A BitConverter classe inclui métodos estáticos para converter cada um dos tipos primitivos para e a partir de um array de bytes, como ilustra a tabela seguinte.
Se usar BitConverter métodos para fazer ida e volta os dados, certifique-se de que o GetBytes método de sobrecarga e oTo método de Tipo especificam o mesmo tipo. Como o exemplo seguinte ilustra, restaurar um array que representa um inteiro assinado chamando o ToUInt32 método pode resultar num valor diferente do original. Para mais informações, consulte Trabalhar com Valores Não Decimais e Signados a Bits.
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
A ordem dos bytes no array devolvida pelas GetBytes sobrecargas do método (bem como a ordem dos bits no inteiro devolvido pelo DoubleToInt64Bits método) depende se a arquitetura do computador é little-endian ou big-endian. De forma semelhante, a ordem dos bytes no array e devolvida pelos To métodos IntegerValue e o ToChar método depende se a arquitetura do computador é little-endian ou big-endian. A endianidade de uma arquitetura é indicada pela IsLittleEndian propriedade, que retorna true em sistemas little-endian e false em sistemas big-endian. Em sistemas little-endian, bytes de ordem inferior precedem bytes de ordem superior. Em sistemas big-endian, bytes de ordem superior precedem bytes de ordem inferior. A tabela seguinte ilustra a diferença nos arrays de bytes que resultam da passagem do inteiro 1.234.567.890 (0x499602D2) para o GetBytes(Int32) método. Os bytes estão listados por ordem desde o byte no índice 0 até ao byte no índice 3.
| Arquitetura | Matriz de bytes |
|---|---|
| Little-endian (ordem de bytes do menor para o maior) | D2-02-96-49 |
| Big-endian | 49-96-02-D2 |
Como o valor de retorno de alguns métodos depende da arquitetura do sistema, tenha cuidado ao transmitir dados de bytes para além dos limites da máquina:
Se todos os sistemas que enviam e recebem dados têm garantia de ter a mesma endianness, nada precisa de ser feito aos dados.
Se os sistemas que enviam e recebem dados podem ter endianidades diferentes, transmita sempre os dados numa ordem específica. Isto significa que a ordem dos bytes no array pode ter de ser invertida antes de os enviar ou depois de os receber. Uma convenção comum é transmitir dados por ordem de bytes de rede (ordem big-endian). O exemplo seguinte fornece uma implementação para enviar um valor inteiro por ordem de bytes de rede.
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: 12345678open 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: 12345678Module 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: 12345678Se os sistemas que enviam e recebem dados podem ter endianness diferente e os dados a transmitir consistem em inteiros com sinal, chame o IPAddress.HostToNetworkOrder método para converter os dados para ordem de bytes de rede e o IPAddress.NetworkToHostOrder método para os converter para a ordem exigida pelo destinatário.
Campos
| Name | Description |
|---|---|
| IsLittleEndian |
Indica a ordem dos bytes ("endianidade") em que os dados são armazenados nesta arquitetura de computador. |
Métodos
| Name | Description |
|---|---|
| DoubleToInt64Bits(Double) |
Converte o número de ponto flutuante de dupla precisão especificado para um inteiro assinado de 64 bits. |
| GetBytes(Boolean) |
Devolve o valor booleano especificado como um array de bytes. |
| GetBytes(Char) |
Devolve o valor especificado do carácter Unicode como um array de bytes. |
| GetBytes(Double) |
Devolve o valor de ponto flutuante de dupla precisão especificado como um array de bytes. |
| GetBytes(Int16) |
Devolve o valor inteiro assinado especificado de 16 bits como um array de bytes. |
| GetBytes(Int32) |
Devolve o valor inteiro com assinatura de 32 bits especificado como um array de bytes. |
| GetBytes(Int64) |
Devolve o valor inteiro assinado especificado de 64 bits como um array de bytes. |
| GetBytes(Single) |
Devolve o valor de ponto flutuante de precisão simples especificado como um array de bytes. |
| GetBytes(UInt16) |
Devolve o valor inteiro não sinalado especificado de 16 bits como um array de bytes. |
| GetBytes(UInt32) |
Devolve o valor inteiro não assinado especificado de 32 bits como um array de bytes. |
| GetBytes(UInt64) |
Devolve o valor inteiro não assinado especificado de 64 bits como um array de bytes. |
| Int32BitsToSingle(Int32) |
Reinterpreta o inteiro especificado de 32 bits como um valor de ponto flutuante de precisão simples. |
| Int64BitsToDouble(Int64) |
Reinterpreta o inteiro com sinal especificado de 64 bits para um número de ponto flutuante de dupla precisão. |
| SingleToInt32Bits(Single) |
Converte um valor de ponto flutuante de precisão simples num inteiro. |
| ToBoolean(Byte[], Int32) |
Devolve um valor booleano convertido a partir do byte numa posição especificada num array de bytes. |
| ToBoolean(ReadOnlySpan<Byte>) |
Converte um intervalo de bytes só de leitura para um valor booleano. |
| ToChar(Byte[], Int32) |
Devolve um carácter Unicode convertido a partir de dois bytes numa posição especificada num array de bytes. |
| ToChar(ReadOnlySpan<Byte>) |
Converte um byte span de apenas leitura num carácter. |
| ToDouble(Byte[], Int32) |
Devolve um número de ponto flutuante de dupla precisão convertido a partir de oito bytes numa posição especificada num array de bytes. |
| ToDouble(ReadOnlySpan<Byte>) |
Converte um intervalo de bytes apenas de leitura num valor de ponto flutuante de dupla precisão. |
| ToInt16(Byte[], Int32) |
Devolve um inteiro assinado de 16 bits convertido a partir de dois bytes numa posição especificada num array de bytes. |
| ToInt16(ReadOnlySpan<Byte>) |
Converte um intervalo de bytes apenas de leitura num inteiro assinado de 16 bits. |
| ToInt32(Byte[], Int32) |
Devolve um inteiro assinado de 32 bits convertido a partir de quatro bytes numa posição especificada num array de bytes. |
| ToInt32(ReadOnlySpan<Byte>) |
Converte um byte span de apenas leitura num inteiro com sinal de 32 bits. |
| ToInt64(Byte[], Int32) |
Devolve um inteiro assinado de 64 bits convertido a partir de oito bytes numa posição especificada num array de bytes. |
| ToInt64(ReadOnlySpan<Byte>) |
Converte um intervalo de bytes só de leitura num inteiro assinado de 64 bits. |
| ToSingle(Byte[], Int32) |
Devolve um número de ponto flutuante de precisão simples convertido a partir de quatro bytes numa posição especificada num array de bytes. |
| ToSingle(ReadOnlySpan<Byte>) |
Converte um intervalo de bytes só de leitura num valor de ponto flutuante de precisão simples. |
| ToString(Byte[], Int32, Int32) |
Converte o valor numérico de cada elemento de um subarray especificado de bytes para a sua representação hexadecimal equivalente. |
| ToString(Byte[], Int32) |
Converte o valor numérico de cada elemento de um subarray especificado de bytes para a sua representação hexadecimal equivalente. |
| ToString(Byte[]) |
Converte o valor numérico de cada elemento de um array especificado de bytes para a sua representação hexadecimal equivalente. |
| ToUInt16(Byte[], Int32) |
Devolve um inteiro sem sinal de 16 bits convertido a partir de dois bytes numa posição especificada num array de bytes. |
| ToUInt16(ReadOnlySpan<Byte>) |
Converte um byte-span de apenas leitura num inteiro sem sinal de 16 bits. |
| ToUInt32(Byte[], Int32) |
Devolve um inteiro sem sinal de 32 bits convertido a partir de quatro bytes numa posição especificada num array de bytes. |
| ToUInt32(ReadOnlySpan<Byte>) |
Converte um byte span de apenas leitura num inteiro sem sinal de 32 bits. |
| ToUInt64(Byte[], Int32) |
Devolve um inteiro sem sinal de 64 bits convertido a partir de oito bytes numa posição especificada num array de bytes. |
| ToUInt64(ReadOnlySpan<Byte>) |
Converte bytes num comprimento sem sinal. |
| TryWriteBytes(Span<Byte>, Boolean) |
Converte um Booleano num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Char) |
Converte um carácter num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Double) |
Converte um valor de ponto flutuante de dupla precisão num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Int16) |
Converte um inteiro com sinal de 16 bits num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Int32) |
Converte um inteiro com sinal de 32 bits num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Int64) |
Converte um inteiro com sinal de 64 bits num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, Single) |
Converte um valor de ponto flutuante de precisão simples num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, UInt16) |
Converte um inteiro não assinado de 16 bits num intervalo de bytes. |
| TryWriteBytes(Span<Byte>, UInt32) |
Converte um inteiro sem sinal de 32 bits num espaço de bytes. |
| TryWriteBytes(Span<Byte>, UInt64) |
Converte um inteiro sem sinal de 64 bits num intervalo de bytes. |