Encoding.GetMaxByteCount(Int32) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
При переопределении в производном классе вычисляет максимальное количество байтов, созданных путем кодирования указанного числа символов.
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
Параметры
- charCount
- Int32
Число символов для кодирования.
Возвращаемое значение
Максимальное количество байтов, созданных путем кодирования указанного числа символов.
Исключения
charCount меньше нуля.
Произошла резервная ошибка (дополнительные сведения см. в разделе "Кодировка символов" в .NET)
-и-
EncoderFallback задан как EncoderExceptionFallback.
Примеры
В следующем примере определяется количество байтов, необходимых для кодирования массива символов, кодирование символов и отображение результирующего байта.
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
Комментарии
Фактически параметр charCount указывает количество объектов, представляющих символы Юникода Char для кодирования, так как .NET внутренне использует UTF-16 для представления символов Юникода. Следовательно, большинство символов Юникода могут быть представлены одним Char объектом, но символ Юникода, представленный суррогатной парой, например, требует двух Char объектов.
Чтобы вычислить точный размер массива, необходимый GetBytes для хранения результирующего байта, следует использовать GetByteCount метод. Чтобы вычислить максимальный размер массива GetMaxByteCount , используйте этот метод. Этот GetByteCount метод обычно позволяет выделять меньше памяти, а GetMaxByteCount метод обычно выполняется быстрее.
GetMaxByteCount получает худшее число случаев, в том числе худший случай для выбранного EncoderFallbackв настоящее время. Если резервный вариант выбран с потенциально большой строкой, извлекает большие значения, GetMaxByteCount особенно в тех случаях, когда худший случай кодирования включает режимы переключения для каждого символа. Например, это может произойти для ISO-2022-JP. Дополнительные сведения см. в записи блога "Что с кодировкой.GetMaxByteCount() и Кодировкой.GetMaxCharCount()?.
В большинстве случаев этот метод получает разумные значения для небольших строк. Для больших строк может потребоваться выбрать вариант использования очень больших буферов и перехвата ошибок в редких случаях, когда более разумный буфер слишком мал. Вы также можете рассмотреть другой подход с помощью GetByteCount или Encoder.Convert.
При использовании GetMaxByteCountнеобходимо выделить выходной буфер на основе максимального размера входного буфера. Если выходной буфер ограничен размером, можно использовать Convert этот метод.
Обратите внимание, что GetMaxByteCount учитывает потенциальные оставшиеся суррогаты из предыдущей операции декодера. Из-за декодера, передавая значение 1 методу, извлекает 2 для однобайтовой кодировки, например ASCII. Если эти сведения необходимы, следует использовать IsSingleByte свойство.
Замечание
GetMaxByteCount(N) не обязательно совпадает со значением N* GetMaxByteCount(1).
Примечания для тех, кто реализует этот метод
Все Encoding реализации должны гарантировать, что исключения переполнения буфера не происходят, если буферы имеют размер в соответствии с результатами вычислений этого метода.