Encoding.GetMaxCharCount(Int32) Metod

Definition

När det åsidosättas i en härledd klass beräknas det maximala antalet tecken som genereras genom avkodning av det angivna antalet byte.

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

Parametrar

byteCount
Int32

Antalet byte som ska avkodas.

Returer

Det maximala antalet tecken som genereras genom avkodning av det angivna antalet byte.

Undantag

byteCount är mindre än noll.

En reserv inträffade (mer information finns i Character Encoding i .NET)

-och-

DecoderFallback är inställt på DecoderExceptionFallback.

Exempel

I följande exempel kodas en sträng till en matris med byte och avkodas sedan byte till en matris med tecken.

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ăǽβ

Kommentarer

Om du vill beräkna den exakta matrisstorlek som krävs för GetChars att lagra de resulterande tecknen bör du använda GetCharCount metoden. Använd metoden för att beräkna den maximala matrisstorleken GetMaxCharCount . Metoden GetCharCount tillåter vanligtvis allokering av mindre minne, medan GetMaxCharCount metoden vanligtvis körs snabbare.

GetMaxCharCount hämtar ett sämsta fall-tal, inklusive det värsta fallet för den valda DecoderFallback. Om du väljer en reserv med en potentiellt stor sträng GetMaxCharCount hämtar du stora värden.

I de flesta fall hämtar den här metoden rimliga tal för små strängar. För stora strängar kan du behöva välja mellan att använda mycket stora buffertar och fånga fel i det sällsynta fallet att en mer rimlig buffert är för liten. Du kanske också vill överväga en annan metod med eller GetCharCountDecoder.Convert.

GetMaxCharCount har ingen relation till GetBytes. Om du behöver en liknande funktion som ska användas med GetBytesbör du använda GetMaxByteCount.

När du använder GetMaxCharCountska du allokera utdatabufferten baserat på den maximala storleken på indatabufferten. Om utdatabufferten är begränsad i storlek kan du använda Decoder.Convert metoden.

Observera att GetMaxCharCount tar hänsyn till det värsta fallet för överblivna byte från en tidigare kodaråtgärd. För de flesta kodsidor hämtar ett värde på 0 till den här metoden värden som är större än eller lika med 1.

Note

GetMaxCharCount(N) är inte nödvändigtvis samma värde som N* GetMaxCharCount(1).

Anteckningar till implementerare

Alla Encoding implementeringar måste garantera att inga buffertöverflödesfel inträffar om buffertar är storleksanpassade enligt resultatet av den här metodens beräkningar.

Gäller för

Se även