Encoding.GetBytes Metoda

Definicja

Po zastąpieniu w klasie pochodnej koduje zestaw znaków w sekwencji bajtów.

Przeciążenia

Nazwa Opis
GetBytes(Char[])

Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonej tablicy znaków w sekwencji bajtów.

GetBytes(String)

Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonym ciągu w sekwencji bajtów.

GetBytes(ReadOnlySpan<Char>, Span<Byte>)

Po przesłonięciu w klasie pochodnej koduje do zakresu bajtów zestaw znaków z określonego zakresu tylko do odczytu.

GetBytes(Char[], Int32, Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do sekwencji bajtów.

GetBytes(String, Int32, Int32)

Po przesłonięciu w klasie pochodnej koduje do tablicy bajtów liczbę znaków określonych count w określonym ciągu, począwszy od określonego indexciągu .

GetBytes(Char*, Int32, Byte*, Int32)

Po przesłonięciu w klasie pochodnej koduje zestaw znaków rozpoczynający się od określonego wskaźnika znaku do sekwencji bajtów przechowywanych od określonego wskaźnika bajtów.

GetBytes(Char[], Int32, Int32, Byte[], Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do określonej tablicy bajtów.

GetBytes(String, Int32, Int32, Byte[], Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonego ciągu do określonej tablicy bajtów.

GetBytes(Char[])

Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonej tablicy znaków w sekwencji bajtów.

public:
 virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars);
public virtual byte[] GetBytes(char[] chars);
abstract member GetBytes : char[] -> byte[]
override this.GetBytes : char[] -> byte[]
Public Overridable Function GetBytes (chars As Char()) As Byte()

Parametry

chars
Char[]

Tablica znaków zawierająca znaki do zakodowania.

Zwraca

Byte[]

Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.

Wyjątki

Parametr chars ma wartość null.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do zakodowania tablicy znaków, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire array, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, u7 );
      PrintCountsAndBytes( myChars, u8 );
      PrintCountsAndBytes( myChars, u16LE );
      PrintCountsAndBytes( myChars, u16BE );
      PrintCountsAndBytes( myChars, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( chars.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF)}
 

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire array, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, u7)
      PrintCountsAndBytes(myChars, u8)
      PrintCountsAndBytes(myChars, u16LE)
      PrintCountsAndBytes(myChars, u16BE)
      PrintCountsAndBytes(myChars, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(chars.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Uwagi

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy wywołać wersję GetBytes ciągu metody .

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy

GetBytes(String)

Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonym ciągu w sekwencji bajtów.

public:
 virtual cli::array <System::Byte> ^ GetBytes(System::String ^ s);
public virtual byte[] GetBytes(string s);
abstract member GetBytes : string -> byte[]
override this.GetBytes : string -> byte[]
Public Overridable Function GetBytes (s As String) As Byte()

Parametry

s
String

Ciąg zawierający znaki do zakodowania.

Zwraca

Byte[]

Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.

Wyjątki

Parametr s ma wartość null.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Uwagi

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy

GetBytes(ReadOnlySpan<Char>, Span<Byte>)

Po przesłonięciu w klasie pochodnej koduje do zakresu bajtów zestaw znaków z określonego zakresu tylko do odczytu.

public:
 virtual int GetBytes(ReadOnlySpan<char> chars, Span<System::Byte> bytes);
public virtual int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes);
abstract member GetBytes : ReadOnlySpan<char> * Span<byte> -> int
override this.GetBytes : ReadOnlySpan<char> * Span<byte> -> int
Public Overridable Function GetBytes (chars As ReadOnlySpan(Of Char), bytes As Span(Of Byte)) As Integer

Parametry

chars
ReadOnlySpan<Char>

Zakres zawierający zestaw znaków do kodowania.

bytes
Span<Byte>

Zakres bajtów do przechowywania zakodowanych bajtów.

Zwraca

Liczba zakodowanych bajtów.

Uwagi

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Dotyczy

GetBytes(Char[], Int32, Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do sekwencji bajtów.

public:
 virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars, int index, int count);
public virtual byte[] GetBytes(char[] chars, int index, int count);
abstract member GetBytes : char[] * int * int -> byte[]
override this.GetBytes : char[] * int * int -> byte[]
Public Overridable Function GetBytes (chars As Char(), index As Integer, count As Integer) As Byte()

Parametry

chars
Char[]

Tablica znaków zawierająca zestaw znaków do kodowania.

index
Int32

Indeks pierwszego znaku do zakodowania.

count
Int32

Liczba znaków do zakodowania.

Zwraca

Byte[]

Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.

Wyjątki

Parametr chars ma wartość null.

index lub count jest mniejsza niż zero.

— lub —

index i count nie oznaczają prawidłowego zakresu w elem chars.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do kodowania trzech znaków z tablicy znaków, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, 4, 3, u7 );
      PrintCountsAndBytes( myChars, 4, 3, u8 );
      PrintCountsAndBytes( myChars, 4, 3, u16LE );
      PrintCountsAndBytes( myChars, 4, 3, u16BE );
      PrintCountsAndBytes( myChars, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars, index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars, index, count );

      // The following is an alternative way to encode the array of chars:
      // byte[] bytes = new byte[iBC];
      // enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, 4, 3, u7)
      PrintCountsAndBytes(myChars, 4, 3, u8)
      PrintCountsAndBytes(myChars, 4, 3, u16LE)
      PrintCountsAndBytes(myChars, 4, 3, u16BE)
      PrintCountsAndBytes(myChars, 4, 3, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars, index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars, index, count)

      ' The following is an alternative way to encode the array of chars:
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      ' Dim bytes(iBC - 1) As Byte
      ' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Uwagi

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy

GetBytes(String, Int32, Int32)

Po przesłonięciu w klasie pochodnej koduje do tablicy bajtów liczbę znaków określonych count w określonym ciągu, począwszy od określonego indexciągu .

public:
 cli::array <System::Byte> ^ GetBytes(System::String ^ s, int index, int count);
public byte[] GetBytes(string s, int index, int count);
member this.GetBytes : string * int * int -> byte[]
Public Function GetBytes (s As String, index As Integer, count As Integer) As Byte()

Parametry

s
String

Ciąg zawierający znaki do zakodowania.

index
Int32

Indeks wewnątrz ciągu, aby rozpocząć kodowanie od.

count
Int32

Liczba znaków do zakodowania.

Zwraca

Byte[]

Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Uwagi

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Dotyczy

GetBytes(Char*, Int32, Byte*, Int32)

Ważne

Ten interfejs API nie jest zgodny ze specyfikacją CLS.

Po przesłonięciu w klasie pochodnej koduje zestaw znaków rozpoczynający się od określonego wskaźnika znaku do sekwencji bajtów przechowywanych od określonego wskaźnika bajtów.

public:
 virtual int GetBytes(char* chars, int charCount, System::Byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int

Parametry

chars
Char*

Wskaźnik do pierwszego znaku w celu zakodowania.

charCount
Int32

Liczba znaków do zakodowania.

bytes
Byte*

Wskaźnik do lokalizacji, w której należy rozpocząć pisanie wynikowej sekwencji bajtów.

byteCount
Int32

Maksymalna liczba bajtów do zapisu.

Zwraca

Rzeczywista liczba bajtów zapisanych w lokalizacji wskazanej bytes przez parametr .

Atrybuty

Wyjątki

Parametr chars ma wartość null.

— lub —

Parametr bytes ma wartość null.

charCount lub byteCount jest mniejsza niż zero.

byteCount jest mniejsza niż wynikowa liczba bajtów.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Uwagi

Aby obliczyć dokładny rozmiar tablicy, który GetBytes wymaga przechowywania wynikowych bajtów, wywołaj metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zazwyczaj umożliwia przydzielanie mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że musi być podzielona na mniejsze bloki, należy użyć Decoder obiektu lub dostarczonego przez GetDecoder metodę lub EncoderGetEncoder, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy

GetBytes(Char[], Int32, Int32, Byte[], Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do określonej tablicy bajtów.

public:
 abstract int GetBytes(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public abstract int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : char[] * int * int * byte[] * int -> int
Public MustOverride Function GetBytes (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

Parametry

chars
Char[]

Tablica znaków zawierająca zestaw znaków do kodowania.

charIndex
Int32

Indeks pierwszego znaku do zakodowania.

charCount
Int32

Liczba znaków do zakodowania.

bytes
Byte[]

Tablica bajtów zawierająca wynikową sekwencję bajtów.

byteIndex
Int32

Indeks, w którym należy rozpocząć pisanie wynikowej sekwencji bajtów.

Zwraca

Rzeczywista liczba bajtów zapisanych w pliku bytes.

Wyjątki

Parametr chars ma wartość null.

— lub —

Parametr bytes ma wartość null.

charIndex lub charCountbyteIndex jest mniejszy niż zero.

— lub —

charIndex i charCount nie oznaczają prawidłowego zakresu w elem chars.

— lub —

byteIndex nie jest prawidłowym indeksem w pliku bytes.

bytes nie ma wystarczającej pojemności od byteIndex do końca tablicy, aby pomieścić wynikowe bajty.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do kodowania trzech znaków z tablicy znaków, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, 4, 3, u7 );
      PrintCountsAndBytes( myChars, 4, 3, u8 );
      PrintCountsAndBytes( myChars, 4, 3, u16LE );
      PrintCountsAndBytes( myChars, 4, 3, u16BE );
      PrintCountsAndBytes( myChars, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars, index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars, index, count );

      // The following is an alternative way to encode the array of chars:
      // byte[] bytes = new byte[iBC];
      // enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, 4, 3, u7)
      PrintCountsAndBytes(myChars, 4, 3, u8)
      PrintCountsAndBytes(myChars, 4, 3, u16LE)
      PrintCountsAndBytes(myChars, 4, 3, u16BE)
      PrintCountsAndBytes(myChars, 4, 3, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars, index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars, index, count)

      ' The following is an alternative way to encode the array of chars:
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      ' Dim bytes(iBC - 1) As Byte
      ' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Uwagi

Aby obliczyć dokładny rozmiar tablicy wymagany przez GetBytes program do przechowywania wynikowych bajtów, należy wywołać metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zazwyczaj umożliwia przydzielanie mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy

GetBytes(String, Int32, Int32, Byte[], Int32)

Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonego ciągu do określonej tablicy bajtów.

public:
 virtual int GetBytes(System::String ^ s, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public virtual int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : string * int * int * byte[] * int -> int
override this.GetBytes : string * int * int * byte[] * int -> int
Public Overridable Function GetBytes (s As String, charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

Parametry

s
String

Ciąg zawierający zestaw znaków do zakodowania.

charIndex
Int32

Indeks pierwszego znaku do zakodowania.

charCount
Int32

Liczba znaków do zakodowania.

bytes
Byte[]

Tablica bajtów zawierająca wynikową sekwencję bajtów.

byteIndex
Int32

Indeks, w którym należy rozpocząć pisanie wynikowej sekwencji bajtów.

Zwraca

Rzeczywista liczba bajtów zapisanych w pliku bytes.

Wyjątki

Parametr s ma wartość null.

— lub —

Parametr bytes ma wartość null.

charIndex lub charCountbyteIndex jest mniejszy niż zero.

— lub —

charIndex i charCount nie oznaczają prawidłowego zakresu w elem s.

— lub —

byteIndex nie jest prawidłowym indeksem w pliku bytes.

bytes nie ma wystarczającej pojemności od byteIndex do końca tablicy, aby pomieścić wynikowe bajty.

Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)

— i —

EncoderFallback jest ustawiony na EncoderExceptionFallback.

Przykłady

Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Uwagi

Aby obliczyć dokładny rozmiar tablicy wymagany przez GetBytes program do przechowywania wynikowych bajtów, należy wywołać metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zazwyczaj umożliwia przydzielanie mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.

Jeśli dane do przekonwertowania są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy ją podzielić na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.

Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.

Obsługiwane są kilka wersji GetByteCount i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:

  • Aplikacja może wymagać zakodowania wielu znaków wejściowych na stronie kodu i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Będzie Encoder pamiętać, że wysoki zastępca, aby można było połączyć go z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc znak zostanie wysłany do EncoderFallback.

  • Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes

  • Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wskaźniki są wymagane.

  • Jeśli aplikacja musi przekonwertować dużą ilość danych, należy ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.

  • Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.

Zobacz też

Dotyczy