Encoding.GetMaxByteCount(Int32) Metod

Definition

När det åsidosättas i en härledd klass beräknar det maximala antalet byte som genereras genom att koda det angivna antalet tecken.

public:
 abstract int GetMaxByteCount(int charCount);
public abstract int GetMaxByteCount(int charCount);
abstract member GetMaxByteCount : int -> int
Public MustOverride Function GetMaxByteCount (charCount As Integer) As Integer

Parametrar

charCount
Int32

Antalet tecken som ska kodas.

Returer

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

Undantag

charCount är mindre än noll.

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

-och-

EncoderFallback är inställt på EncoderExceptionFallback.

Exempel

I följande exempel fastställs antalet byte som krävs för att koda en teckenmatris, kodar tecknen och visar de resulterande byteen.

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

Kommentarer

Parametern charCount anger faktiskt antalet Char objekt som representerar Unicode-tecknen som ska kodas, eftersom .NET internt använder UTF-16 för att representera Unicode-tecken. Därför kan de flesta Unicode-tecken representeras av ett Char objekt, men ett Unicode-tecken som representeras av ett surrogatpar kräver till exempel två Char objekt.

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

GetMaxByteCount hämtar ett sämsta fall-tal, inklusive det värsta fallet för den valda EncoderFallback. Om en återställning väljs med en potentiellt stor sträng GetMaxByteCount hämtar den stora värden, särskilt i de fall där det värsta fallet för kodningen är att växla lägen för varje tecken. Detta kan till exempel inträffa för ISO-2022-JP. Mer information finns i blogginlägget "What's with Encoding.GetMaxByteCount() and Encoding.GetMaxCharCount()?.

I de flesta fall hämtar den här metoden rimliga värden 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 sällsynta fall när en mer rimlig buffert är för liten. Du kanske också vill överväga en annan metod med eller GetByteCountEncoder.Convert.

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

Observera att GetMaxByteCount potentiella överblivna surrogater från en tidigare avkodningsåtgärd beaktas. På grund av avkodaren hämtar överföringen av värdet 1 till metoden 2 för en kodning med en enda byte, till exempel ASCII. Du bör använda egenskapen IsSingleByte om den här informationen behövs.

Note

GetMaxByteCount(N) är inte nödvändigtvis samma värde som N* GetMaxByteCount(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