Encoding: GetMaxByteCount

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

Parameters

CharCount
[ByVal] Long. The number of characters to be encoded.

Return Values

Long - 

Remarks

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).
Notes to Implementers

All Encoding implementations must guarantee that no buffer overflow exceptions occur if buffers are sized according to the results of this methods calculations.

Exceptions

ExceptionCondition
ArgumentOutOfRangeException CharCount is less than zero.
EncoderFallbackException A fallback occurred
-and-
EncoderFallback is set to EncoderExceptionFallback.

Examples

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

See Also

Project CorLib Overview

Class Encoding Overview

GetBytes

GetByteCount