Auf Englisch lesen

Freigeben über


Encoding.GetMaxByteCount(Int32) Methode

Definition

Berechnet beim Überschreiben in einer abgeleiteten Klasse die maximale Anzahl der Bytes, die beim Codieren der angegebenen Anzahl von Zeichen erzeugt werden.

C#
public abstract int GetMaxByteCount(int charCount);

Parameter

charCount
Int32

Die Anzahl der zu codierenden Zeichen.

Gibt zurück

Die maximale Anzahl an Bytes, die beim Codieren der angegebenen Anzahl von Zeichen erzeugt werden.

Ausnahmen

charCount ist kleiner als Null.

Es ist ein Fallback aufgetreten (weitere Informationen finden Sie unter Zeichencodierung in .NET).

- und -

Für EncoderFallback ist EncoderExceptionFallback festgelegt.

Beispiele

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

C#
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

*/

Hinweise

Der- charCount Parameter gibt tatsächlich die Anzahl der- Char Objekte an, die die zu codierende 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 Ersatz Zeichenpaar dargestellt wird, erfordert beispielsweise zwei- Char Objekte.

Verwenden Sie die-Methode, um die genaue Array Größe zu berechnen, die von GetBytes für das Speichern der resultierenden Bytes benötigt wird GetByteCount . Verwenden Sie die-Methode, um die maximale Array Größe zu berechnen GetMaxByteCount . Die- GetByteCount Methode ermöglicht im Allgemeinen die Zuordnung von weniger Arbeitsspeicher, während die- GetMaxByteCount Methode im Allgemeinen schneller ausgeführt wird.

GetMaxByteCountRuft die Anzahl der schlechtesten Fälle ab, einschließlich des ungünstigsten Falls für den aktuell ausgewählten EncoderFallback . Wenn ein Fall Back mit einer potenziell großen Zeichenfolge ausgewählt wird, GetMaxByteCount ruft große Werte ab, insbesondere in Fällen, in denen der schlechteste Fall für die Codierung das Wechseln von Modi für jedes Zeichen einschließt. Dies kann z. b. bei ISO-2022-JP der Fall sein. Weitere Informationen finden Sie im Blogbeitrag "Was ist mit Encoding. GetMaxByteCount () und Encoding. GetMaxCharCount ()?".

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

Bei Verwendung GetMaxByteCount von sollten Sie den Ausgabepuffer basierend auf der maximalen Größe des Eingabe Puffers zuordnen. Wenn die Größe des Ausgabepuffers eingeschränkt ist, können Sie die- Convert Methode verwenden.

Beachten Sie, dass die GetMaxByteCount möglichen übrig gebliebenen Ersatz Zeichen von einem vorherigen Decoder-Vorgang berücksichtigt. Aufgrund des Decoders wird durch Übergeben des Werts 1 an die-Methode 2 für eine Einzel Byte Codierung, z. b. ASCII, abgerufen. IsSingleByteWenn diese Informationen erforderlich sind, sollten Sie die-Eigenschaft verwenden.

Hinweis

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

Hinweise für Ausführende

Alle Encoding Implementierungen müssen sicherstellen, dass keine Pufferüberlauf Ausnahmen auftreten, wenn Puffer entsprechend den Ergebnissen der Berechnungen dieser Methode vergrößert werden.

Gilt für:

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Weitere Informationen