Encoding.GetMaxCharCount(Int32) Metoda

Definice

Při přepsání v odvozené třídě vypočítá maximální počet znaků vytvořený dekódováním zadaného počtu bajtů.

public:
 abstract int GetMaxCharCount(int byteCount);
public abstract int GetMaxCharCount(int byteCount);
abstract member GetMaxCharCount : int -> int
Public MustOverride Function GetMaxCharCount (byteCount As Integer) As Integer

Parametry

byteCount
Int32

Počet bajtů, které se mají dekódovat.

Návraty

Maximální počet znaků vytvořených dekódováním zadaného počtu bajtů.

Výjimky

Hodnota byteCount je menší než nula.

Došlo k záložnímu použití (další informace najdete v tématu Kódování znaků v .NET).

a

DecoderFallback je nastaveno na DecoderExceptionFallback.

Příklady

Následující příklad zakóduje řetězec do pole bajtů a potom dekóduje bajty do pole znaků.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Encoding u32LE = Encoding.GetEncoding( "utf-32" );
      Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );

      // Use a string containing the following characters:
      //    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)
      String myStr = "za\u0306\u01FD\u03B2";

      // Encode the string using the big-endian byte order.
      byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
      u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );

      // Encode the string using the little-endian byte order.
      byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
      u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );

      // Get the char counts, and decode the byte arrays.
      Console.Write( "BE array with BE encoding : " );
      PrintCountsAndChars( barrBE, u32BE );
      Console.Write( "LE array with LE encoding : " );
      PrintCountsAndChars( barrLE, u32LE );
   }

   public static void PrintCountsAndChars( byte[] bytes, Encoding enc )  {

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

      // Display the exact character count.
      int iCC  = enc.GetCharCount( bytes );
      Console.Write( " {0,-3}", iCC );

      // Display the maximum character count.
      int iMCC = enc.GetMaxCharCount( bytes.Length );
      Console.Write( " {0,-3} :", iMCC );

      // Decode the bytes and display the characters.
      char[] chars = enc.GetChars( bytes );
      Console.WriteLine( chars );
   }
}


/* 
This code produces the following output.  The question marks take the place of characters that cannot be displayed at the console.

BE array with BE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ
LE array with LE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
      Dim u32BE As Encoding = Encoding.GetEncoding("utf-32BE")

      ' Use a string containing the following characters:
      '    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)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) 

      ' Encode the string using the big-endian byte order.
      ' 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 barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
      u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)

      ' Encode the string using the little-endian byte order.
      ' 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 barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
      u32LE.GetBytes(myStr, 0, myStr.Length, barrLE, 0)

      ' Get the char counts, and decode the byte arrays.
      Console.Write("BE array with BE encoding : ")
      PrintCountsAndChars(barrBE, u32BE)
      Console.Write("LE array with LE encoding : ")
      PrintCountsAndChars(barrLE, u32LE)

   End Sub


   Public Shared Sub PrintCountsAndChars(bytes() As Byte, enc As Encoding)

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

      ' Display the exact character count.
      Dim iCC As Integer = enc.GetCharCount(bytes)
      Console.Write(" {0,-3}", iCC)

      ' Display the maximum character count.
      Dim iMCC As Integer = enc.GetMaxCharCount(bytes.Length)
      Console.Write(" {0,-3} :", iMCC)

      ' Decode the bytes and display the characters.
      Dim chars As Char() = enc.GetChars(bytes)
      Console.WriteLine(chars)

   End Sub

End Class


'This code produces the following output.  The question marks take the place of characters that cannot be displayed at the console.
'
'BE array with BE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ
'LE array with LE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ

Poznámky

K výpočtu přesné velikosti pole požadované GetChars k uložení výsledných znaků byste měli použít metodu GetCharCount . K výpočtu maximální velikosti pole použijte metodu GetMaxCharCount . Metoda GetCharCount obecně umožňuje přidělení menší paměti, zatímco GetMaxCharCount metoda obvykle provádí rychleji.

GetMaxCharCount načte číslo nejhoršího případu, včetně nejhoršího případu aktuálně vybraného DecoderFallback. Pokud je vybrán náhradní řetězec s potenciálně velkým řetězcem, GetMaxCharCount načte velké hodnoty.

Ve většině případů tato metoda načte rozumná čísla pro malé řetězce. U velkých řetězců si možná budete muset vybrat mezi používáním velmi velkých vyrovnávacích pamětí a zachycením chyb ve výjimečných případech, že vhodnější vyrovnávací paměť je příliš malá. Můžete také zvážit jiný přístup pomocí GetCharCount nebo Decoder.Convert.

GetMaxCharCount nemá žádný vztah k GetBytes. Pokud potřebujete podobnou funkci použít s GetBytes, měli byste použít GetMaxByteCount.

Při použití GetMaxCharCountbyste měli přidělit výstupní vyrovnávací paměť na základě maximální velikosti vstupní vyrovnávací paměti. Pokud je výstupní vyrovnávací paměť omezena velikostí, můžete použít metodu Decoder.Convert .

Mějte na paměti, že GetMaxCharCount nejhorší případ pro zbývající bajty z předchozí operace kodéru. U většiny znakových stránek předáte této metodě hodnotu 0, načte hodnoty větší než nebo rovno 1.

Note

GetMaxCharCount(N) nemusí být nutně stejná hodnota jako N* GetMaxCharCount(1).

Poznámky pro implementátory

Všechny Encoding implementace musí zaručit, že nedojde k žádným výjimkám přetečení vyrovnávací paměti, pokud jsou vyrovnávací paměti nastaveny podle výsledků výpočtů této metody.

Platí pro

Viz také