Прочитать на английском

Поделиться через


Encoding.GetBytes Метод

Определение

При переопределении в производном классе кодирует набор символов в последовательность байтов.

Перегрузки

GetBytes(Char[])

При переопределении в производном классе кодирует все символы из указанного массива символов в последовательность байтов.

GetBytes(String)

При переопределении в производном классе кодирует все символы заданной строки в последовательность байтов.

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

При переопределении в производном классе кодирует в диапазон байтов набор символов из указанного диапазона только для чтения.

GetBytes(Char[], Int32, Int32)

При переопределении в производном классе кодирует набор символов из указанного массива символов в последовательность байтов.

GetBytes(String, Int32, Int32)

При переопределении в производном классе кодирует в массив байтов количество символов, заданных count в указанной строке, начиная с указанного index.

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

При переопределении в производном классе кодирует набор символов, начало которого задается указателем символа, в последовательность байтов, которые сохраняются, начиная с заданного указателя байта.

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

При переопределении в производном классе кодирует набор символов из указанного массива символов в указанный массив байтов.

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

При переопределении в производном классе кодирует набор символов из заданной строки в заданный массив байтов.

GetBytes(Char[])

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует все символы из указанного массива символов в последовательность байтов.

C#
public virtual byte[] GetBytes (char[] chars);

Параметры

chars
Char[]

Массив символов, содержащий символы, которые требуется закодировать.

Возвращаемое значение

Byte[]

Массив байтов, содержащий результаты кодирования указанного набора символов.

Исключения

chars имеет значение null.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования массива символов, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатным. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низкой суррогатной в начале следующего вызова. Encoding не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует вызвать строковую версию GetBytes метода.

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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.6, 2.0, 2.1
UWP 10.0

GetBytes(String)

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует все символы заданной строки в последовательность байтов.

C#
public virtual byte[] GetBytes (string s);

Параметры

s
String

Строка, содержащая символы, которые требуется закодировать.

Возвращаемое значение

Byte[]

Массив байтов, содержащий результаты кодирования указанного набора символов.

Исключения

s имеет значение null.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования строки или диапазона в строке, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатным. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низкой суррогатной в начале следующего вызова. Encoding не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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.6, 2.0, 2.1
UWP 10.0

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

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует в диапазон байтов набор символов из указанного диапазона только для чтения.

C#
public virtual int GetBytes (ReadOnlySpan<char> chars, Span<byte> bytes);

Параметры

chars
ReadOnlySpan<Char>

Диапазон, содержащий кодируемый набор символов.

bytes
Span<Byte>

Диапазон байтов для хранения закодированных байтов.

Возвращаемое значение

Число закодированных байтов.

Комментарии

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатным. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низкой суррогатной в начале следующего вызова. Encoding не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

GetBytes(Char[], Int32, Int32)

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует набор символов из указанного массива символов в последовательность байтов.

C#
public virtual byte[] GetBytes (char[] chars, int index, int count);

Параметры

chars
Char[]

Массив символов, содержащий набор кодируемых символов.

index
Int32

Индекс первого кодируемого символа.

count
Int32

Число кодируемых символов.

Возвращаемое значение

Byte[]

Массив байтов, содержащий результаты кодирования указанного набора символов.

Исключения

chars имеет значение null.

Значение параметра index или count меньше нуля.

-или-

Параметры index и count не указывают допустимый диапазон в chars.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования трех символов из массива символов, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатом. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низким суррогатом в начале следующего вызова. Encoding Не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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.6, 2.0, 2.1
UWP 10.0

GetBytes(String, Int32, Int32)

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует в массив байтов количество символов, заданных count в указанной строке, начиная с указанного index.

C#
public byte[] GetBytes (string s, int index, int count);

Параметры

s
String

Строка, содержащая символы, которые требуется закодировать.

index
Int32

Индекс в строке, с которого начинается кодирование.

count
Int32

Число кодируемых символов.

Возвращаемое значение

Byte[]

Массив байтов, содержащий результаты кодирования указанного набора символов.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования строки или диапазона в строке, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатом. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низким суррогатом в начале следующего вызова. Encoding Не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

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

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

Важно!

Этот API несовместим с CLS.

При переопределении в производном классе кодирует набор символов, начало которого задается указателем символа, в последовательность байтов, которые сохраняются, начиная с заданного указателя байта.

C#
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
C#
[System.CLSCompliant(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
C#
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
C#
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);

Параметры

chars
Char*

Указатель на первый кодируемый символ.

charCount
Int32

Число кодируемых символов.

bytes
Byte*

Указатель на положение, с которого начинается запись результирующей последовательности байтов.

byteCount
Int32

Максимальное число байтов для записи.

Возвращаемое значение

Фактическое число байтов, записанных в местоположение, которое задано параметром bytes.

Атрибуты

Исключения

chars имеет значение null.

-или-

bytes имеет значение null.

Значение параметра charCount или byteCount меньше нуля.

byteCount меньше результирующего числа байтов.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Комментарии

Чтобы вычислить точный размер массива, который GetBytes требуется для хранения результирующих байтов, вызовите GetByteCount метод. Чтобы вычислить максимальный размер массива, вызовите GetMaxByteCount метод. GetByteCountМетод обычно позволяет выделить меньше памяти, в то время GetMaxByteCount как метод обычно выполняется быстрее.

Если преобразование данных доступен только в последовательных блоках (например, данные, считанные из потока) или если объем данных настолько велик, что ему следует разделить на более мелкие блоки, следует использовать Decoder или Encoder объект, предоставляемый GetDecoderнастроек или GetEncoder метода, соответственно, производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатом. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низким суррогатом в начале следующего вызова. Encoding Не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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 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.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует набор символов из указанного массива символов в указанный массив байтов.

C#
public abstract int GetBytes (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);

Параметры

chars
Char[]

Массив символов, содержащий набор кодируемых символов.

charIndex
Int32

Индекс первого кодируемого символа.

charCount
Int32

Число кодируемых символов.

bytes
Byte[]

Массив байтов, в который будет помещена результирующая последовательность байтов.

byteIndex
Int32

Индекс, с которого начинается запись результирующей последовательности байтов.

Возвращаемое значение

Фактическое число байтов, записанных в bytes.

Исключения

chars имеет значение null.

-или-

bytes имеет значение null.

Значение параметра charIndex, charCount или byteIndex меньше нуля.

-или-

ПараметрыcharIndex и charCount не указывают допустимый диапазон в chars.

-или-

Значение параметра byteIndex не является допустимым индексом в bytes.

Недостаточно емкости bytes от byteIndex до конца массива для размещения полученных байтов.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования трех символов из массива символов, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Чтобы вычислить точный размер массива GetBytes , необходимый для хранения результирующих байтов, следует вызвать GetByteCount метод. Чтобы вычислить максимальный размер массива, вызовите GetMaxByteCount метод. GetByteCountМетод обычно позволяет выделить меньше памяти, в то время GetMaxByteCount как метод обычно выполняется быстрее.

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатным. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низкой суррогатной в начале следующего вызова. Encoding не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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.6, 2.0, 2.1
UWP 10.0

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

Исходный код:
Encoding.cs
Исходный код:
Encoding.cs
Исходный код:
Encoding.cs

При переопределении в производном классе кодирует набор символов из заданной строки в заданный массив байтов.

C#
public virtual int GetBytes (string s, int charIndex, int charCount, byte[] bytes, int byteIndex);

Параметры

s
String

Строка, содержащая набор символов для кодирования.

charIndex
Int32

Индекс первого кодируемого символа.

charCount
Int32

Число кодируемых символов.

bytes
Byte[]

Массив байтов, в который будет помещена результирующая последовательность байтов.

byteIndex
Int32

Индекс, с которого начинается запись результирующей последовательности байтов.

Возвращаемое значение

Фактическое число байтов, записанных в bytes.

Исключения

s имеет значение null.

-или-

bytes имеет значение null.

Значение параметра charIndex, charCount или byteIndex меньше нуля.

-или-

ПараметрыcharIndex и charCount не указывают допустимый диапазон в chars.

-или-

Значение параметра byteIndex не является допустимым индексом в bytes.

Недостаточно емкости bytes от byteIndex до конца массива для размещения полученных байтов.

Произошел откат (см. сведения о кодировке символов в .NET)

- и -

Параметру EncoderFallback задается значение EncoderExceptionFallback.

Примеры

В следующем примере определяется число байтов, необходимое для кодирования строки или диапазона в строке, символы кодируются и выводятся полученные байты.

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

*/

Комментарии

Чтобы вычислить точный размер массива GetBytes , необходимый для хранения результирующих байтов, следует вызвать GetByteCount метод. Чтобы вычислить максимальный размер массива, вызовите GetMaxByteCount метод. GetByteCountМетод обычно позволяет выделить меньше памяти, в то время GetMaxByteCount как метод обычно выполняется быстрее.

Если данные для преобразования доступны только в последовательных блоках (например, чтение данных из потока) или если объем данных настолько велик, что необходимо разделить на меньшие блоки, следует использовать Decoder или, Encoder предоставленный GetDecoder методом или GetEncoder методом, соответственно, для производного класса.

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку. Encoding.GetBytesМетод принимает дискретные преобразования, в отличие от Encoder.GetBytes метода, который обрабатывает несколько преобразований в одном входном потоке.

GetByteCountПоддерживаются несколько версий и GetBytes . Ниже приведены некоторые рекомендации по программированию для использования этих методов.

  • Приложению может потребоваться закодировать множество входных символов в кодовую страницу и обработать символы с помощью нескольких вызовов. В этом случае, возможно, потребуется поддерживать состояние между вызовами, принимая во внимание состояние, которое сохраняется Encoder используемым объектом. (Например, последовательность символов, которая включает суррогатные пары, может заканчиваться высоким суррогатным. Будет Encoder помнить, что высокий суррогат, чтобы его можно было объединить с низкой суррогатной в начале следующего вызова. Encoding не сможет поддерживать состояние, поэтому символ будет отправлен в EncoderFallback.)

  • Если приложение обрабатывает входные данные строки, следует использовать строковую версию GetBytes .

  • Версия буфера символов Юникода GetBytes(Char*, Int32, Byte*, Int32) позволяет использовать некоторые быстрые методы, в частности с несколькими вызовами, которые используют Encoder объект или вставляются в существующие буферы. Однако следует помнить, что эта версия метода иногда является ненадежной, так как указатели являются обязательными.

  • Если приложение должно преобразовать большой объем данных, следует повторно использовать выходной буфер. В этом случае GetBytes наилучшим выбором является версия, которая поддерживает массивы байтов.

  • Рассмотрите возможность использования Encoder.Convert метода вместо GetByteCount . Метод преобразования преобразует как можно больше данных и создает исключение, если выходной буфер слишком мал. Для непрерывной кодировки потока этот метод часто является лучшим выбором.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.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.6, 2.0, 2.1
UWP 10.0