Теперь, когда Net является открытым исходным кодом, вы можете просмотреть исходный код кодировок, включенных в платформу.
Похоже, что реализации Unicode используют interop для вызова некоторого нативного кода для выполнения фактического работают, но есть некоторые, которые полностью реализованы в C#, такие как ISCIIEnocding
Вот источник: https://referencesource.microsoft.com/#mscorlib / system / text / isciiencoding.cs
Чтобы создать реализацию для новой кодировки, вам необходимо создать подкласс System.Text.Encoding
и реализовать следующие методы. Я предполагаю, что вы используете простую кодировку 1: 1, например, roman8, если не все будет немного сложнее!
GetByteCount()
и GetCharCount()
оба возвращают количество байтов / символов, введенных на входе будет производить. В этом случае мы можем просто вернуть длину входного массива.
GetMaxByteCount()
и GetMaxCharCount
похожи, но возвращают теоретическое максимальное количество элементов, которое может быть возвращено для данного ввода. Еще раз, мы можем просто вернуть ту же длину.
Чтобы выполнить фактическое преобразование, будут вызваны эти методы. Базовый класс Encoding позаботится о создании массивов для вас, вам просто нужно заполнить вывод правильными значениями.
public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
{
for (var i = 0; i < charCount; i++)
{
bytes[byteIndex + i] = GetByte(chars[charIndex + i]);
}
return charCount;
}
Где GetByte()
- это простой метод для поиска индекса символ в вашем массиве.
public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
{
for (var i = 0; i < byteCount; i++)
{
chars[charIndex + i] = conversionArray[bytes[byteIndex + i]];
}
return byteCount;
}
Заполните conversionArray
вашими символами с правильным индексом для кодировки.
См. https://dotnetfiddle.net/eBvgc6 для рабочего примера .