Petscii Decoder
//----------------------------------------------------------------------- // <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 }; } } } }