Encoding: GetMaxByteCount |
When implemented in a derived class, calculates the maximum number of bytes produced by encoding the specified number of characters.
Public Function GetMaxByteCount( ByVal CharCount As Long ) As Long
The CharCount parameter actually specifies the number of Char objects that represent the Unicode characters to encode, because Visual Basic 6 internally uses UTF-16 to represent Unicode characters. Consequently, most Unicode characters can be represented by one Char object, but a Unicode character represented by a surrogate pair, for example, requires two Char objects.
To calculate the exact array size required by GetBytes to store the resulting bytes, you should use the GetByteCount method. To calculate the maximum array size, use the GetMaxByteCount method. The GetByteCount method generally allows allocation of less memory, while the GetMaxByteCount method generally executes faster.
GetMaxByteCount retrieves a worst-case number, including the worst case for the currently selected EncoderFallback. If a fallback is chosen with a potentially large string, GetMaxByteCount retrieves large values, particularly in cases where the worst case for the encoding involves switching modes for every character.
In most cases, this method retrieves reasonable values for small strings. For large strings, you might have to choose between using very large buffers and catching errors in the rare case when a more reasonable buffer is too small. You might also want to consider a different approach using GetByteCount or Encoder.Convert.
When using GetMaxByteCount, you should allocate the output buffer based on the maximum size of the input buffer. If the output buffer is constrained in size, you might use the Convert method.
Note that GetMaxByteCount considers potential leftover surrogates from a previous decoder operation. Because of the decoder, passing a value of 1 to the method retrieves 2 for a single-byte encoding, such as ASCII. You should use the IsSingleByte property if this information is necessary.
Note |
---|
GetMaxByteCount(N) is not necessarily the same value as N* GetMaxByteCount(1) . |
All Encoding implementations must guarantee that no buffer overflow exceptions occur if buffers are sized according to the results of this methods calculations.
Exception | Condition |
---|---|
ArgumentOutOfRangeException | CharCount is less than zero. |
EncoderFallbackException | A fallback occurred -and- EncoderFallback is set to EncoderExceptionFallback. |
The following example determines the number of bytes required to encode a character array, encodes the characters, and displays the resulting bytes.
Public Sub Main() Dim MyChars() As Integer Dim U7 As Encoding Dim U8 As Encoding Dim U16LE As Encoding Dim U16BE As Encoding Dim U32 As Encoding ' 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) MyChars = NewChars("z", "a", &H306, &H1FD, &H3B2, &HD8FF, &HDCFF) ' Get different encodings. Set U7 = Encoding.UTF7 Set U8 = Encoding.UTF8 Set U16LE = Encoding.Unicode Set U16BE = Encoding.BigEndianUnicode Set 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 Console.ReadKey End Sub Private Sub PrintCountsAndBytes(ByRef Chars() As Integer, ByVal Enc As Encoding) Dim BC As Long Dim MBC As Long Dim Bytes() As Byte ' Display the name of the encoding used. Console.WriteValue "{0,-30} :", Enc.ToString ' Display the exact byte count. BC = Enc.GetByteCount(Chars) Console.WriteValue " {0,-3}", BC ' Display the maximum byte count. MBC = Enc.GetMaxByteCount(CorArray.Length(Chars)) Console.WriteValue " {0,-3} :", MBC ' Encode the array of chars. Bytes = Enc.GetBytes(Chars) ' Display all the encoded bytes. PrintHexBytes Bytes End Sub Private Sub PrintHexBytes(ByRef Bytes() As Byte) Dim i As Long For i = LBound(Bytes) To UBound(Bytes) Console.WriteValue "{0:X2} ", Bytes(i) Next Console.WriteLine End Sub ' 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