Sdílet prostřednictvím


Encoding.GetMaxByteCount(Int32) Metoda

Definice

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

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

Parametry

charCount
Int32

Počet znaků, které se mají zakódovat.

Návraty

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

Výjimky

Hodnota charCount 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

EncoderFallback je nastaveno na EncoderExceptionFallback.

Příklady

Následující příklad určuje počet bajtů potřebných ke kódování pole znaků, kóduje znaky a zobrazí výsledné bajty.

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

Poznámky

Parametr charCount ve skutečnosti určuje počet Char objektů, které představují znaky Unicode pro kódování, protože .NET interně používá UTF-16 k reprezentaci znaků Unicode. V důsledku toho může být většina znaků Unicode reprezentována jedním Char objektem, ale znak Unicode reprezentovaný náhradní dvojicí, například vyžaduje dva Char objekty.

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

GetMaxByteCount načte číslo nejhoršího případu, včetně nejhoršího případu aktuálně vybraného EncoderFallback. Pokud je vybrán náhradní řetězec s potenciálně velkým řetězcem, GetMaxByteCount načte velké hodnoty, zejména v případech, kdy nejhorší případ pro kódování zahrnuje přepínání režimů pro každý znak. Může k tomu například dojít pro ISO-2022-JP. Další informace najdete v blogovém příspěvku "What's with Encoding.GetMaxByteCount() and Encoding.GetMaxCharCount()?.

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

Při použití GetMaxByteCountbyste 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 Convert .

Mějte na paměti, že GetMaxByteCount potenciální přechází náhrady z předchozí operace dekodéru. Z důvodu dekodéru předání hodnoty 1 metodě načte 2 pro kódování s jedním bajtem, například ASCII. Pokud jsou tyto informace nezbytné, měli byste tuto vlastnost použít IsSingleByte .

Poznámka:

GetMaxByteCount(N) nemusí být nutně stejná hodnota jako N* GetMaxByteCount(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é