public override int GetMaxByteCount(int charCount)
{
if (charCount < 0)
throw new ArgumentOutOfRangeException(nameof(charCount), SR.ArgumentOutOfRange_NeedNonNegNum);
Contract.EndContractBlock();
// Characters would be # of characters + 1 in case high surrogate is ? * max fallback
long byteCount = (long)charCount + 1;
if (EncoderFallback.MaxCharCount > 1)
byteCount *= EncoderFallback.MaxCharCount;
// Start with just generic DBCS values (sort of).
int perChar = 2;
int extraStart = 0;
int extraEnd = 0;
switch (CodePage)
{
case 50220:
case 50221:
// 2 bytes per char + 3 bytes switch to JIS 0208 or 1 byte + 3 bytes switch to 1 byte CP
perChar = 5; // 5 max (4.5 average)
extraEnd = 3; // 3 bytes to shift back to ASCII
break;
case 50222:
// 2 bytes per char + 3 bytes switch to JIS 0208 or 1 byte + 3 bytes switch to 1 byte CP
perChar = 5; // 5 max (4.5 average)
extraEnd = 4; // 1 byte to shift from Katakana -> DBCS, 3 bytes to shift back to ASCII from DBCS
break;
case 50225:
// 2 bytes per char + 1 byte SO, or 1 byte per char + 1 byte SI.
perChar = 3; // 3 max, (2.5 average)
extraStart = 4; // EUC-KR marker appears at beginning of file.
extraEnd = 1; // 1 byte to shift back to ascii if necessary.
break;
case 52936:
// 2 bytes per char + 2 byte shift, or 1 byte + 1 byte shift
// Worst case: left over surrogate with no low surrogate is extra ?, could have to switch to ASCII, then could have HZ and flush to ASCII mode
perChar = 4; // 4 max, (3.5 average if every other char is HZ/ASCII)
extraEnd = 2; // 2 if we have to shift back to ASCII
break;
}
// Return our surrogate and End plus perChar for each char.
byteCount *= perChar;
byteCount += extraStart + extraEnd;
if (byteCount > 0x7fffffff)
throw new ArgumentOutOfRangeException(nameof(charCount), SR.ArgumentOutOfRange_GetByteCountOverflow);
return (int)byteCount;
}