Encoding.GetMaxByteCount(Int32) Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
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ó:
-é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.