private void DetectEncoding()
{
if (_byteLen < 2)
{
return;
}
_detectEncoding = false;
bool changedEncoding = false;
if (_byteBuffer[0] == 0xFE && _byteBuffer[1] == 0xFF)
{
// Big Endian Unicode
_encoding = Encoding.BigEndianUnicode;
CompressBuffer(2);
changedEncoding = true;
}
else if (_byteBuffer[0] == 0xFF && _byteBuffer[1] == 0xFE)
{
// Little Endian Unicode, or possibly little endian UTF32
if (_byteLen < 4 || _byteBuffer[2] != 0 || _byteBuffer[3] != 0)
{
_encoding = Encoding.Unicode;
CompressBuffer(2);
changedEncoding = true;
}
else
{
_encoding = Encoding.UTF32;
CompressBuffer(4);
changedEncoding = true;
}
}
else if (_byteLen >= 3 && _byteBuffer[0] == 0xEF && _byteBuffer[1] == 0xBB && _byteBuffer[2] == 0xBF)
{
// UTF-8
_encoding = Encoding.UTF8;
CompressBuffer(3);
changedEncoding = true;
}
else if (_byteLen >= 4 && _byteBuffer[0] == 0 && _byteBuffer[1] == 0 &&
_byteBuffer[2] == 0xFE && _byteBuffer[3] == 0xFF)
{
// Big Endian UTF32
_encoding = new UTF32Encoding(bigEndian: true, byteOrderMark: true);
CompressBuffer(4);
changedEncoding = true;
}
else if (_byteLen == 2)
{
_detectEncoding = true;
}
// Note: in the future, if we change this algorithm significantly,
// we can support checking for the preamble of the given encoding.
if (changedEncoding)
{
_decoder = _encoding.GetDecoder();
_maxCharsPerBuffer = _encoding.GetMaxCharCount(_byteBuffer.Length);
_charBuffer = new char[_maxCharsPerBuffer];
}
}