Encoding.GetMaxByteCount(Int32) Metódus

Definíció

Származtatott osztályban felülbírálva kiszámítja a megadott számú karakter kódolásával előállított bájtok maximális számát.

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

Paraméterek

charCount
Int32

A kódolandó karakterek száma.

Válaszok

A megadott számú karakter kódolásával előállított bájtok maximális száma.

Kivételek

charCount kisebb, mint nulla.

Hiba történt (további információ: Acharacter kódolása a .NET)

-és-

EncoderFallback EncoderExceptionFallbackértékre van állítva.

Példák

Az alábbi példa egy karaktertömb kódolásához, a karakterek kódolásához és az eredményként kapott bájtok megjelenítéséhez szükséges bájtok számát határozza meg.

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

Megjegyzések

A charCount paraméter ténylegesen meghatározza azoknak a Char objektumoknak a számát, amelyek a Kódolás Unicode-karaktereket jelölik, mivel .NET belsőleg UTF-16-ot használ a Unicode-karakterek megjelenítéséhez. Ennek következtében a Unicode-karakterek többsége egy Char objektummal ábrázolható, de egy helyettesítő pár által képviselt Unicode-karakterhez például két Char objektumra van szükség.

Az eredményként kapott bájtok tárolásához szükséges GetBytes pontos tömbméret kiszámításához használja a metódust GetByteCount . A maximális tömbméret kiszámításához használja a metódust GetMaxByteCount . A GetByteCount metódus általában kevesebb memória lefoglalását teszi lehetővé, míg a GetMaxByteCount metódus általában gyorsabban fut.

GetMaxByteCount A rendszer a legrosszabb esetszámot kéri le, beleértve az aktuálisan kiválasztott EncoderFallbackeset legrosszabb esetét is. Ha egy tartalékot egy potenciálisan nagy sztringgel választ, GetMaxByteCount nagy értékeket kér le, különösen olyan esetekben, amikor a kódolás legrosszabb esete minden karakterhez váltási módokat tartalmaz. Ez történhet például ISO-2022-JP esetén. További információt a "What's with Encoding.GetMaxByteCount() and Encoding.GetMaxCharCount()?.

A legtöbb esetben ez a módszer a kis sztringek ésszerű értékeit kéri le. Nagy sztringek esetén előfordulhat, hogy a nagyon nagy pufferek és a fogási hibák között kell választania, ha egy ésszerűbb puffer túl kicsi. Érdemes lehet megfontolni egy másik megközelítést is a vagy a .GetByteCountEncoder.Convert

A használat GetMaxByteCountsorán a kimeneti puffert a bemeneti puffer maximális mérete alapján kell lefoglalni. Ha a kimeneti puffer mérete korlátozott, használhatja a metódust Convert .

Vegye figyelembe, hogy figyelembe veszi az GetMaxByteCount előző dekóderműveletből származó esetleges hátrahagyott pótlékokat. A dekóder miatt az 1 értéknek a metódusnak való átadása 2-t kér le egy egy bájtos kódoláshoz, például az ASCII-t. Ha szükséges, használja a IsSingleByte tulajdonságot.

Note

GetMaxByteCount(N) nem feltétlenül ugyanaz az érték, mint N* GetMaxByteCount(1)a .

Megjegyzések az implementálókhoz

Minden Encoding implementációnak biztosítania kell, hogy ne történjen puffertúllépési kivétel, ha a pufferek mérete a módszer számításainak eredményei szerint van méretezve.

A következőre érvényes:

Lásd még