Bagikan melalui


UTF32Encoding.GetMaxByteCount(Int32) Metode

Definisi

Menghitung jumlah maksimum byte yang dihasilkan dengan mengodekan jumlah karakter yang ditentukan.

public:
 override int GetMaxByteCount(int charCount);
public override int GetMaxByteCount (int charCount);
override this.GetMaxByteCount : int -> int
Public Overrides Function GetMaxByteCount (charCount As Integer) As Integer

Parameter

charCount
Int32

Jumlah karakter yang akan dikodekan.

Mengembalikan

Jumlah maksimum byte yang dihasilkan dengan mengodekan jumlah karakter yang ditentukan.

Pengecualian

charCount kurang dari nol.

-atau-

Jumlah byte yang dihasilkan lebih besar dari angka maksimum yang dapat dikembalikan sebagai bilangan bulat.

Fallback terjadi (untuk informasi selengkapnya, lihat Pengodean Karakter di .NET)

-dan-

EncoderFallback diatur ke EncoderExceptionFallback.

Contoh

Contoh berikut menentukan jumlah byte yang diperlukan untuk mengodekan string, lalu mengodekan string dan menampilkan byte yang dihasilkan.

using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( String^ s, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int 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 = L"za\u0306\u01FD\u03B2\xD8FF\xDCFF";
   
   // Create instances of different encodings.
   UTF7Encoding^ u7 = gcnew UTF7Encoding;
   UTF8Encoding^ u8Nobom = gcnew UTF8Encoding( false,true );
   UTF8Encoding^ u8Bom = gcnew UTF8Encoding( true,true );
   UTF32Encoding ^ u32Nobom = gcnew UTF32Encoding( false,false,true );
   UTF32Encoding ^ u32Bom = gcnew UTF32Encoding( false,true,true );
   
   // Get the byte counts and the bytes.
   PrintCountsAndBytes( myStr, u7 );
   PrintCountsAndBytes( myStr, u8Nobom );
   PrintCountsAndBytes( myStr, u8Bom );
   PrintCountsAndBytes( myStr, u32Nobom );
   PrintCountsAndBytes( myStr, u32Bom );
}

void PrintCountsAndBytes( String^ s, Encoding^ enc )
{
   
   // Display the name of the encoding used.
   Console::Write( "{0,-25} :", enc );
   
   // 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 );
   
   // Get the byte order mark, if any.
   array<Byte>^preamble = enc->GetPreamble();
   
   // Combine the preamble and the encoded bytes.
   array<Byte>^bytes = gcnew array<Byte>(preamble->Length + iBC);
   Array::Copy( preamble, bytes, preamble->Length );
   enc->GetBytes( s, 0, s->Length, bytes, preamble->Length );
   
   // Display all the encoded bytes.
   PrintHexBytes( bytes );
}

void PrintHexBytes( array<Byte>^bytes )
{
   if ( (bytes == nullptr) || (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.UTF8Encoding  : 12  24  :EF BB BF 7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UTF32Encoding : 24  28  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
System.Text.UTF32Encoding : 24  28  :FF FE 00 00 7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

*/
using System;
using System.Text;

public class SamplesUTF32Encoding  {

   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";

      // Create instances of different encodings.
      UTF7Encoding  u7       = new UTF7Encoding();
      UTF8Encoding  u8Nobom  = new UTF8Encoding( false, true );
      UTF8Encoding  u8Bom    = new UTF8Encoding( true,  true );
      UTF32Encoding u32Nobom = new UTF32Encoding( false, false, true );
      UTF32Encoding u32Bom   = new UTF32Encoding( false, true,  true );

      // Get the byte counts and the bytes.
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8Nobom );
      PrintCountsAndBytes( myStr, u8Bom );
      PrintCountsAndBytes( myStr, u32Nobom );
      PrintCountsAndBytes( myStr, u32Bom );
   }

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

      // Display the name of the encoding used.
      Console.Write( "{0,-25} :", 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 );

      // Get the byte order mark, if any.
      byte[] preamble = enc.GetPreamble();

      // Combine the preamble and the encoded bytes.
      byte[] bytes = new byte[preamble.Length + iBC];
      Array.Copy( preamble, bytes, preamble.Length );
      enc.GetBytes( s, 0, s.Length, bytes, preamble.Length );

      // 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.UTF8Encoding  : 12  24  :EF BB BF 7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UTF32Encoding : 24  28  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
System.Text.UTF32Encoding : 24  28  :FF FE 00 00 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 SamplesUTF32Encoding   

   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)

      ' Create instances of different encodings.
      Dim u7 As New UTF7Encoding()
      Dim u8Nobom As New UTF8Encoding(False, True)
      Dim u8Bom As New UTF8Encoding(True, True)
      Dim u32Nobom As New UTF32Encoding(False, False, True)
      Dim u32Bom As New UTF32Encoding(False, True, True)

      ' Get the byte counts and the bytes.
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8Nobom)
      PrintCountsAndBytes(myStr, u8Bom)
      PrintCountsAndBytes(myStr, u32Nobom)
      PrintCountsAndBytes(myStr, u32Bom)

   End Sub


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

      ' Display the name of the encoding used.
      Console.Write("{0,-25} :", 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)

      ' Get the byte order mark, if any.
      Dim preamble As Byte() = enc.GetPreamble()

      ' Combine the preamble and the encoded bytes.
      ' NOTE: In Visual Basic, arrays contain one extra element by default.
      '       The following line creates an array with the exact number of elements required.
      Dim bytes(preamble.Length + iBC - 1) As Byte
      Array.Copy(preamble, bytes, preamble.Length)
      enc.GetBytes(s, 0, s.Length, bytes, preamble.Length)

      ' 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.UTF8Encoding  : 12  24  :EF BB BF 7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UTF32Encoding : 24  28  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'System.Text.UTF32Encoding : 24  28  :FF FE 00 00 7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Keterangan

Untuk menghitung ukuran array yang tepat yang diperlukan oleh GetBytes untuk menyimpan byte yang dihasilkan, Anda memanggil GetByteCount metode . Untuk menghitung ukuran array maksimum, Anda memanggil GetMaxByteCount metode . Metode ini GetByteCount umumnya mengalokasikan lebih sedikit memori, sementara GetMaxByteCount metode umumnya dijalankan lebih cepat.

GetMaxByteCount adalah angka terburuk, termasuk kasus terburuk untuk yang saat ini dipilih EncoderFallback. Jika fallback dipilih dengan string yang berpotensi besar, GetMaxByteCount dapat mengembalikan nilai besar.

Dalam kebanyakan kasus, metode ini mengembalikan angka yang wajar untuk string kecil. Untuk string besar, Anda mungkin harus memilih antara menggunakan buffer yang sangat besar dan menangkap kesalahan dalam kasus yang jarang terjadi bahwa buffer yang lebih masuk akal terlampaui. Anda mungkin juga ingin mempertimbangkan pendekatan dan penggunaan GetByteCount yang berbeda atau Encoder.Convert.

GetMaxByteCount tidak memiliki hubungan dengan GetChars. Jika Anda memerlukan fungsi serupa untuk digunakan dengan GetChars, gunakan GetMaxCharCount.

Catatan

GetMaxByteCount(N) belum tentu nilai yang sama dengan N* GetMaxByteCount(1).

Berlaku untuk

Lihat juga