Encoding.GetMaxByteCount(Int32) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Wanneer deze wordt overschreven in een afgeleide klasse, berekent u het maximum aantal bytes dat wordt geproduceerd door het opgegeven aantal tekens te coderen.
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
Parameters
- charCount
- Int32
Het aantal tekens dat moet worden gecodeerd.
Retouren
Het maximum aantal bytes dat wordt geproduceerd door het opgegeven aantal tekens te coderen.
Uitzonderingen
charCount is kleiner dan nul.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat is vereist om een tekenmatrix te coderen, de tekens te coderen en de resulterende bytes weer te geven.
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
Opmerkingen
De parameter charCount geeft het aantal Char-objecten aan die de Unicode-tekens vertegenwoordigen om te coderen, omdat .NET intern gebruikmaakt van UTF-16 om Unicode-tekens weer te geven. Daarom kunnen de meeste Unicode-tekens worden vertegenwoordigd door één Char object, maar een Unicode-teken dat wordt vertegenwoordigd door een surrogaatpaar, vereist bijvoorbeeld twee Char objecten.
Als u de exacte matrixgrootte wilt berekenen die nodig is om GetBytes de resulterende bytes op te slaan, moet u de GetByteCount methode gebruiken. Als u de maximale matrixgrootte wilt berekenen, gebruikt u de GetMaxByteCount methode. Met de GetByteCount methode kan over het algemeen minder geheugen worden toegewezen, terwijl de GetMaxByteCount methode doorgaans sneller wordt uitgevoerd.
GetMaxByteCount haalt een slechtst getal op, inclusief het slechtste geval voor de geselecteerde EncoderFallback. Als een terugval wordt gekozen met een mogelijk grote tekenreeks, haalt u grote waarden op, GetMaxByteCount met name in gevallen waarin het slechtste geval voor de codering de modi voor elk teken omvat. Dit kan bijvoorbeeld gebeuren voor ISO-2022-JP. Zie het blogbericht What's with Encoding.GetMaxByteCount() and Encoding.GetMaxCharCount()? (Engelstalig) voor meer informatie.
In de meeste gevallen worden met deze methode redelijke waarden opgehaald voor kleine tekenreeksen. Voor grote tekenreeksen moet u mogelijk kiezen tussen het gebruik van zeer grote buffers en het ondervangen van fouten in zeldzame gevallen wanneer een meer redelijke buffer te klein is. U kunt ook een andere benadering overwegen met behulp van GetByteCount of Encoder.Convert.
Wanneer u deze GetMaxByteCountgebruikt, moet u de uitvoerbuffer toewijzen op basis van de maximale grootte van de invoerbuffer. Als de uitvoerbuffer in grootte is beperkt, kunt u de Convert methode gebruiken.
Houd er rekening mee dat GetMaxByteCount potentiële restover surrogaten van een eerdere decoderbewerking worden beschouwd. Door de decoder een waarde van 1 door te geven aan de methode wordt 2 opgehaald voor een codering met één byte, zoals ASCII. U moet de IsSingleByte eigenschap gebruiken als deze informatie nodig is.
Note
GetMaxByteCount(N) is niet noodzakelijkerwijs dezelfde waarde als N* GetMaxByteCount(1).
Notities voor uitvoerders
Alle Encoding implementaties moeten garanderen dat er geen bufferoverloop-uitzonderingen optreden als buffers worden aangepast aan de resultaten van de berekeningen van deze methode.