Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


BitConverter Klasa

Definicja

Konwertuje podstawowe typy danych na tablicę bajtów i tablicę bajtów na podstawowe typy danych.

C#
public static class BitConverter
C#
public sealed class BitConverter
Dziedziczenie
BitConverter

Przykłady

Poniższy przykład kodu ilustruje użycie kilku metod klasy BitConverter.

C#
// 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
*/

Uwagi

Klasa BitConverter pomaga manipulować typami wartości w ich podstawowej formie jako serii bajtów. Bajt jest definiowany jako 8-bitowa liczba całkowita bez znaku. Klasa BitConverter zawiera metody statyczne do konwertowania poszczególnych typów pierwotnych na i z tablicy bajtów, jak pokazano w poniższej tabeli.

Jeśli używasz metod BitConverter do danych dwukierunkowych, upewnij się, że przeciążenie GetBytes i metoda ToType określają ten sam typ. Jak pokazano w poniższym przykładzie, przywrócenie tablicy reprezentującej podpisaną liczbę całkowitą przez wywołanie metody ToUInt32 może spowodować, że wartość różni się od oryginalnej. Aby uzyskać więcej informacji, zobacz Praca z podpisanymi wartościami nieprzecinkowymi i bitowymi.

C#
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

Kolejność bajtów w tablicy zwracanej przez przeciążenia metody GetBytes (a także kolejność bitów w liczbą całkowitą zwracaną przez metodę DoubleToInt64Bits) zależy od tego, czy architektura komputera jest mała, czy big-endian. Podobnie kolejność bajtów w tablicy i zwracana przez metody ToIntegerValue i metoda ToChar zależy od tego, czy architektura komputera jest mało endian, czy big-endian. Endianness architektury jest wskazywana przez właściwość IsLittleEndian, która zwraca true w systemach mało endińskich i false w systemach big-endian. W systemach typu little-endian bajty niższej kolejności poprzedzają bajty o wyższej kolejności. W systemie big-endian bajty wyższego rzędu poprzedzają bajty niższej kolejności. W poniższej tabeli przedstawiono różnicę w tablicach bajtów, które wynikają z przekazania liczby całkowitej 1234 567 890 (0x499602D2) do metody GetBytes(Int32). Bajty są wyświetlane w kolejności od bajtu w indeksie 0 do bajtu w indeksie 3.

Little-endian D2-02-96-49
Big-endian 49-96-02-D2

Ponieważ wartość zwracana niektórych metod zależy od architektury systemu, należy zachować ostrożność podczas przesyłania danych bajtów poza granice maszyny:

  • Jeśli wszystkie systemy wysyłające i odbierające dane mają gwarancję takiej samej endianness, nie trzeba nic robić z danymi.

  • Jeśli systemy wysyłające i odbierające dane mogą mieć różną endianność, zawsze przesyłają dane w określonej kolejności. Oznacza to, że kolejność bajtów w tablicy może być odwrócona przed ich wysłaniem lub po otrzymaniu. Typową konwencją jest przesyłanie danych w kolejności bajtów sieciowych (kolejność big-endian). Poniższy przykład zawiera implementację wysyłania wartości całkowitej w kolejności bajtów sieciowych.

    C#
    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
    
  • Jeśli systemy wysyłające i odbierające dane mogą mieć różne endianness, a dane, które mają być przesyłane, składają się z podpisanych liczb całkowitych, wywołaj metodę IPAddress.HostToNetworkOrder, aby przekonwertować dane na kolejność bajtów sieciowych i metodę IPAddress.NetworkToHostOrder, aby przekonwertować je na kolejność wymaganą przez odbiorcę.

Pola

IsLittleEndian

Wskazuje kolejność bajtów ("endianness"), w której dane są przechowywane w tej architekturze komputera.

Metody

DoubleToInt64Bits(Double)

Konwertuje określoną liczbę zmiennoprzecinkową o podwójnej precyzji na 64-bitową liczbę całkowitą ze znakiem.

DoubleToUInt64Bits(Double)

Konwertuje określoną liczbę zmiennoprzecinkową o podwójnej precyzji na 64-bitową liczbę całkowitą bez znaku.

GetBytes(Boolean)

Zwraca określoną wartość logiczną jako tablicę bajtów.

GetBytes(Char)

Zwraca określoną wartość znaku Unicode jako tablicę bajtów.

GetBytes(Double)

Zwraca określoną wartość zmiennoprzecinkową o podwójnej precyzji jako tablicę bajtów.

GetBytes(Half)

Zwraca określoną wartość zmiennoprzecinkową o połowę precyzji jako tablicę bajtów.

GetBytes(Int128)

Zwraca określoną 128-bitową wartość całkowitą ze znakiem jako tablicę bajtów.

GetBytes(Int16)

Zwraca określoną 16-bitową wartość całkowitą ze znakiem jako tablicę bajtów.

GetBytes(Int32)

Zwraca określoną 32-bitową wartość całkowitą ze znakiem jako tablicę bajtów.

GetBytes(Int64)

Zwraca 64-bitową wartość całkowitą ze znakiem 64-bitowym jako tablicę bajtów.

GetBytes(Single)

Zwraca określoną wartość zmiennoprzecinkową o pojedynczej precyzji jako tablicę bajtów.

GetBytes(UInt128)

Zwraca 128-bitową niepodpisaną wartość całkowitą jako tablicę bajtów.

GetBytes(UInt16)

Zwraca 16-bitową niepodpisaną wartość całkowitą jako tablicę bajtów.

GetBytes(UInt32)

Zwraca 32-bitową niepodpisaną wartość całkowitą jako tablicę bajtów.

GetBytes(UInt64)

Zwraca 64-bitową niepodpisaną wartość całkowitą jako tablicę bajtów.

HalfToInt16Bits(Half)

Konwertuje wartość zmiennoprzecinkowa o pół precyzji na 16-bitową liczbę całkowitą.

HalfToUInt16Bits(Half)

Konwertuje określoną liczbę zmiennoprzecinkową o połowę precyzji na 16-bitową liczbę całkowitą bez znaku.

Int16BitsToHalf(Int16)

Ponownie interpretuje określoną 16-bitową wartość całkowitą ze znakiem jako wartość zmiennoprzecinkowa o połowę precyzji.

Int32BitsToSingle(Int32)

Ponownie interpretuje określoną liczbę całkowitą 32-bitową jako wartość zmiennoprzecinkową o pojedynczej precyzji.

Int64BitsToDouble(Int64)

Ponownie interpretuje 64-bitową liczbę całkowitą ze znakiem 64-bitowym na liczbę zmiennoprzecinkową o podwójnej precyzji.

SingleToInt32Bits(Single)

Konwertuje wartość zmiennoprzecinkową o pojedynczej precyzji na liczbę całkowitą.

SingleToUInt32Bits(Single)

Konwertuje określoną liczbę zmiennoprzecinkową o pojedynczej precyzji na 32-bitową liczbę całkowitą bez znaku.

ToBoolean(Byte[], Int32)

Zwraca wartość logiczną przekonwertowaną z bajtu na określoną pozycję w tablicy bajtów.

ToBoolean(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na wartość logiczną.

ToChar(Byte[], Int32)

Zwraca znak Unicode przekonwertowany z dwóch bajtów w określonej pozycji w tablicy bajtów.

ToChar(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na znak.

ToDouble(Byte[], Int32)

Zwraca liczbę zmiennoprzecinkową o podwójnej precyzji przekonwertowaną z ośmiu bajtów w określonej pozycji w tablicy bajtów.

ToDouble(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na wartość zmiennoprzecinkową o podwójnej precyzji.

ToHalf(Byte[], Int32)

Zwraca liczbę zmiennoprzecinkową o pół precyzji przekonwertowaną z dwóch bajtów w określonej pozycji w tablicy bajtów.

ToHalf(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na wartość zmiennoprzecinkową o pół precyzji.

ToInt128(Byte[], Int32)

Zwraca 128-bitową liczbę całkowitą ze znakiem przekonwertowaną z szesnastu bajtów w określonej pozycji w tablicy bajtów.

ToInt128(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 128-bitową liczbę całkowitą ze znakiem.

ToInt16(Byte[], Int32)

Zwraca 16-bitową liczbę całkowitą ze znakiem przekonwertowaną z dwóch bajtów na określonej pozycji w tablicy bajtów.

ToInt16(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 16-bitową liczbę całkowitą ze znakiem.

ToInt32(Byte[], Int32)

Zwraca 32-bitową liczbę całkowitą ze znakiem przekonwertowaną z czterech bajtów na określonej pozycji w tablicy bajtów.

ToInt32(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 32-bitową liczbę całkowitą ze znakiem.

ToInt64(Byte[], Int32)

Zwraca 64-bitową liczbę całkowitą ze znakiem przekonwertowaną z ośmiu bajtów na określonej pozycji w tablicy bajtów.

ToInt64(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 64-bitową liczbę całkowitą ze znakiem.

ToSingle(Byte[], Int32)

Zwraca liczbę zmiennoprzecinkową o pojedynczej precyzji przekonwertowaną z czterech bajtów w określonej pozycji w tablicy bajtów.

ToSingle(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na wartość zmiennoprzecinkową o pojedynczej precyzji.

ToString(Byte[])

Konwertuje wartość liczbową każdego elementu określonej tablicy bajtów na równoważną reprezentację ciągu szesnastkowego.

ToString(Byte[], Int32)

Konwertuje wartość liczbową każdego elementu określonego podarray bajtów na równoważną reprezentację ciągu szesnastkowego.

ToString(Byte[], Int32, Int32)

Konwertuje wartość liczbową każdego elementu określonego podarray bajtów na równoważną reprezentację ciągu szesnastkowego.

ToUInt128(Byte[], Int32)

Zwraca 128-bitową liczbę całkowitą bez znaku przekonwertowaną z czterech bajtów na określonej pozycji w tablicy bajtów.

ToUInt128(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 128-bitową niepodpisaną liczbę całkowitą.

ToUInt16(Byte[], Int32)

Zwraca 16-bitową liczbę całkowitą bez znaku przekonwertowaną z dwóch bajtów na określonej pozycji w tablicy bajtów.

ToUInt16(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 16-bitową niepodpisaną liczbę całkowitą.

ToUInt32(Byte[], Int32)

Zwraca 32-bitową liczbę całkowitą bez znaku przekonwertowaną z czterech bajtów na określonej pozycji w tablicy bajtów.

ToUInt32(ReadOnlySpan<Byte>)

Konwertuje zakres bajtów tylko do odczytu na 32-bitową niepodpisaną liczbę całkowitą.

ToUInt64(Byte[], Int32)

Zwraca 64-bitową liczbę całkowitą bez znaku przekonwertowaną z ośmiu bajtów na określonej pozycji w tablicy bajtów.

ToUInt64(ReadOnlySpan<Byte>)

Konwertuje bajty na niepodpisane długo.

TryWriteBytes(Span<Byte>, Boolean)

Konwertuje wartość logiczną na zakres bajtów.

TryWriteBytes(Span<Byte>, Char)

Konwertuje znak na zakres bajtów.

TryWriteBytes(Span<Byte>, Double)

Konwertuje wartość zmiennoprzecinkową o podwójnej precyzji na zakres bajtów.

TryWriteBytes(Span<Byte>, Half)

Konwertuje wartość zmiennoprzecinkową o pół precyzji na zakres bajtów.

TryWriteBytes(Span<Byte>, Int128)

Konwertuje 128-bitową liczbę całkowitą ze znakiem na zakres bajtów.

TryWriteBytes(Span<Byte>, Int16)

Konwertuje 16-bitową liczbę całkowitą ze znakiem na zakres bajtów.

TryWriteBytes(Span<Byte>, Int32)

Konwertuje 32-bitową liczbę całkowitą ze znakiem na zakres bajtów.

TryWriteBytes(Span<Byte>, Int64)

Konwertuje 64-bitową liczbę całkowitą ze znakiem na zakres bajtów.

TryWriteBytes(Span<Byte>, Single)

Konwertuje wartość zmiennoprzecinkową o pojedynczej precyzji na zakres bajtów.

TryWriteBytes(Span<Byte>, UInt128)

Konwertuje 128-bitową liczbę całkowitą bez znaku na zakres bajtów.

TryWriteBytes(Span<Byte>, UInt16)

Konwertuje niepodpisaną 16-bitową liczbę całkowitą na zakres bajtów.

TryWriteBytes(Span<Byte>, UInt32)

Konwertuje 32-bitową liczbę całkowitą bez znaku na zakres bajtów.

TryWriteBytes(Span<Byte>, UInt64)

Konwertuje niepodpisaną liczbę całkowitą 64-bitową na zakres bajtów.

UInt16BitsToHalf(UInt16)

Konwertuje określoną 16-bitową liczbę całkowitą bez znaku na liczbę zmiennoprzecinkową o połowę precyzji.

UInt32BitsToSingle(UInt32)

Konwertuje określoną 32-bitową liczbę całkowitą bez znaku na liczbę zmiennoprzecinkową o pojedynczej precyzji.

UInt64BitsToDouble(UInt64)

Konwertuje 64-bitową liczbę całkowitą bez znaku na liczbę zmiennoprzecinkową o podwójnej precyzji.

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Zobacz też