Mega Code Archive

 
Categories / C# / Internationalization
 

Extends System Text Encoding to create Petscii Encoding

//----------------------------------------------------------------------- // <copyright file="Program.cs" company="Payton Byrd"> //     Copyright (c) 2007 Payton Byrd.  All rights reserved. // </copyright> //----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Text; namespace CBM_Commander.Common.Encoding {     public class Petscii : System.Text.Encoding     {         public static PetsciiEncoder GetPetsciiEncoder()         {             return new PetsciiEncoder();         }         public static PetsciiDecoder GetPetsciiDecoder()         {             return new PetsciiDecoder();         }         public override int GetByteCount(             char[] chars,             int index,             int count)         {             return GetPetsciiEncoder().GetByteCount(                 chars, index, count, false);         }         public override int GetBytes(             char[] chars,             int charIndex,             int charCount,             byte[] bytes,             int byteIndex)         {             return GetPetsciiEncoder().GetBytes(                 chars, charIndex, charCount,                 bytes, byteIndex, false);         }         public override int GetCharCount(             byte[] bytes,             int index,             int count)         {             return GetPetsciiDecoder().GetCharCount(                 bytes, index, count);         }         public override int GetChars(             byte[] bytes,             int byteIndex,             int byteCount,             char[] chars,             int charIndex)         {             return GetPetsciiDecoder().GetChars(                 bytes, byteIndex, byteCount,                 chars, charIndex);         }         public override int GetMaxByteCount(int charCount)         {             return charCount;         }         public override int GetMaxCharCount(int byteCount)         {             return byteCount;         }     } } //----------------------------------------------------------------------- // <copyright file="Program.cs" company="Payton Byrd"> //     Copyright (c) 2007 Payton Byrd.  All rights reserved. // </copyright> //----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Text; namespace CBM_Commander.Common.Encoding {     public sealed class PetsciiDecoder : Decoder     {         private byte[] _newLine = null;         private byte[] _space = null;         internal PetsciiDecoder()         {             _newLine = ASCIIEncoding.ASCII.GetBytes("\n");             _space = ASCIIEncoding.ASCII.GetBytes(" ");         }         public override int GetCharCount(             byte[] bytes,             int index,             int count)         {             DecodeBytes(                 bytes, index,                 count, index);             return count;         }         public override int GetChars(             byte[] bytes,             int byteIndex,             int byteCount,             char[] chars,             int charIndex)         {             char[] decodedChars =                 DecodeBytes(                     bytes, byteIndex,                     byteCount, charIndex);             for (int i = byteIndex;                 i < (byteIndex + byteCount);                 i++)             {                 chars[charIndex + (i - byteIndex)] =                     decodedChars[i];             }             return byteCount;         }         private char[] DecodeBytes(             byte[] bytes,             int byteIndex,             int byteCount,             int charIndex)         {             char[] results = null;             List<byte> output = new List<byte>();             byte[] translated = null;             foreach (byte b in bytes)             {                 output.AddRange(TranslateByte(b));             }             translated = output.ToArray();             results =                 ASCIIEncoding.ASCII.GetChars(translated);             return results;         }         /// <summary>         ///          /// </summary>         /// <param name="Character"></param>         /// <returns></returns>         private byte[] TranslateByte(byte SourceByte)         {             switch (SourceByte & 0xff)             {                 case 0x0a:                 case 0x0d:                     return _newLine;                 case 0x40:                 case 0x60:                     return new byte[] { SourceByte };                 case 0xa0:                 case 0xe0:                     return _space;                 default:                     switch (SourceByte & 0xe0)                     {                         case 0x40:                         case 0x60:                             return new byte[] { (byte)(SourceByte ^ (byte)0x20) };                         case 0xc0:                             return new byte[] { (byte)(SourceByte ^ (byte)0x80) };                     }                     return new byte[] { SourceByte };             }         }     } } Petscii Encoder //----------------------------------------------------------------------- // <copyright file="Program.cs" company="Payton Byrd"> //     Copyright (c) 2007 Payton Byrd.  All rights reserved. // </copyright> //----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Text; namespace CBM_Commander.Common.Encoding {     public sealed class PetsciiEncoder : Encoder     {         private byte[] _newLine = null;         private byte[] _space = null;         private Dictionary<char, byte>             _ascii = new Dictionary<char, byte>();         internal PetsciiEncoder()         {             _newLine = ASCIIEncoding.ASCII.GetBytes("\n");             _space = ASCIIEncoding.ASCII.GetBytes(" ");             for (byte i = 0x00; i < 0xFF; i++)             {                 char c = (char)i;                 _ascii.Add(c,                     ASCIIEncoding.ASCII.GetBytes(                         new char[] { c })[0]);             }         }         public override int GetByteCount(             char[] chars,             int index,             int count,             bool flush)         {             List<byte> targetBytes = new List<byte>();             byte[] sourceBytes =                 ASCIIEncoding.ASCII.GetBytes(chars);             for (int i = index; i < (index + count); i++)             {                 targetBytes.Add(                     TranslateCharacter(sourceBytes[i]));             }             return targetBytes.Count;         }         public override int GetBytes(             char[] chars,             int charIndex,             int charCount,             byte[] bytes,             int byteIndex,             bool flush)         {             List<byte> targetBytes = new List<byte>();             byte[] sourceBytes =                 ASCIIEncoding.ASCII.GetBytes(chars);             foreach (byte b in sourceBytes)             {                 targetBytes.Add(TranslateCharacter(b));             }             for (                 int i = charIndex;                 i < (charIndex + charCount);                 i++)             {                 bytes[byteIndex + (i - charIndex)] =                     targetBytes[i];             }             return charCount;         }         private byte TranslateCharacter(byte Character)         {             if (                 Character >= 0x5B &&                 Character <= 0x7E)             {                 return (byte)(Character ^ 0x20);             }             else if (                 Character >= _ascii['A'] &&                 Character <= _ascii['Z'])             {                 return (byte)(Character | 0x80);             }             else if (Character == _newLine[0])             {                 return 0x0D;             }             return Character;         }     } }