Freigeben über


Encoding.GetMaxByteCount(Int32) Methode

Definition

Wenn eine abgeleitete Klasse überschrieben wird, wird die maximale Anzahl von Byte berechnet, die durch codieren der angegebenen Anzahl von Zeichen erzeugt werden.

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

Parameter

charCount
Int32

Die Anzahl der zu codierenden Zeichen.

Gibt zurück

Die maximale Anzahl von Byte, die durch die Codierung der angegebenen Anzahl von Zeichen erzeugt werden.

Ausnahmen

charCount ist kleiner als 0 (null).

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Im folgenden Beispiel wird die Anzahl der Bytes bestimmt, die zum Codieren eines Zeichenarrays erforderlich sind, die Zeichen codiert und die resultierenden Bytes angezeigt.

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

Hinweise

Der charCount Parameter gibt tatsächlich die Anzahl der Char Objekte an, die die zu codierenden Unicode-Zeichen darstellen, da .NET intern UTF-16 verwendet, um Unicode-Zeichen darzustellen. Folglich können die meisten Unicode-Zeichen durch ein Char Objekt dargestellt werden, aber ein Unicode-Zeichen, das durch ein Ersatzpaar dargestellt wird, erfordert beispielsweise zwei Char Objekte.

Um die genaue Arraygröße zu berechnen, die zum GetBytes Speichern der resultierenden Bytes erforderlich ist, sollten Sie die GetByteCount Methode verwenden. Verwenden Sie die GetMaxByteCount Methode, um die maximale Arraygröße zu berechnen. Die GetByteCount Methode ermöglicht in der Regel die Zuordnung von weniger Arbeitsspeicher, während die GetMaxByteCount Methode im Allgemeinen schneller ausgeführt wird.

GetMaxByteCount Ruft eine Worst-Case-Zahl ab, einschließlich des schlimmsten Falls für die aktuell ausgewählte EncoderFallback. Wenn ein Fallback mit einer potenziell großen Zeichenfolge ausgewählt wird, werden große Werte abgerufen, GetMaxByteCount insbesondere in Fällen, in denen im schlimmsten Fall für die Codierung der Wechselmodus für jedes Zeichen erforderlich ist. Dies kann beispielsweise für ISO-2022-JP geschehen. Weitere Informationen finden Sie im Blogbeitrag "What's with Encoding.GetMaxByteCount() and Encoding.GetMaxCharCount()?.

In den meisten Fällen ruft diese Methode angemessene Werte für kleine Zeichenfolgen ab. Bei großen Zeichenfolgen müssen Sie möglicherweise zwischen der Verwendung sehr großer Puffer und dem Abfangen von Fehlern im seltenen Fall wählen, wenn ein angemessenerer Puffer zu klein ist. Möglicherweise möchten Sie auch einen anderen Ansatz in Betracht ziehen, der verwendet GetByteCount oder verwendet wird Encoder.Convert.

Bei Verwendung GetMaxByteCountsollten Sie den Ausgabepuffer basierend auf der maximalen Größe des Eingabepuffers zuordnen. Wenn der Ausgabepuffer in der Größe eingeschränkt ist, können Sie die Convert Methode verwenden.

Beachten Sie, dass GetMaxByteCount potenzielle Übergänger aus einem vorherigen Decodervorgang berücksichtigt werden. Aufgrund des Decoders ruft das Übergeben eines Werts von 1 an die Methode 2 für eine Single-Byte-Codierung ab, z. B. ASCII. Sie sollten die IsSingleByte Eigenschaft verwenden, wenn diese Informationen erforderlich sind.

Hinweis

GetMaxByteCount(N) ist nicht unbedingt derselbe Wert wie N* GetMaxByteCount(1).

Hinweise für Ausführende

Alle Encoding Implementierungen müssen sicherstellen, dass keine Pufferüberlaufausnahmen auftreten, wenn Puffer entsprechend den Ergebnissen der Berechnungen dieser Methode angepasst werden.

Gilt für:

Weitere Informationen