如何实现Baudot编码

时间:2014-03-21 19:50:53

标签: c# .net character-encoding

我正在尝试在.Net中实现Baudot character encoding(每个字符代码6位)。这是Cospas Sarsat device

我首先来自Encoding类:

public class BaudotEncoding : Encoding {

我正在寻找一种简单有效的方法来实现双向字符映射(地图可以只读):

Dictionary<char, int> CharacterMap = new Dictionary<char, int> {
    { ' ', 0x100100 },
    { '-', 0x011000 },
    { '/', 0x010111 },
    { '0', 0x001101 },
    { '1', 0x011101 },
    { '2', 0x011001 },
    ...
}

我还需要弄清楚如何实现GetBytes

System.Text.Encoding方法
public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) {

我无法弄清楚如何实现此方法,因为字符不适合漂亮的8位集。

1 个答案:

答案 0 :(得分:1)

简单的字符串常量可能足以将字符映射到int值,并且可能比Dictionary更快。这个快速抛出的代码显示了我在your previous question中描述的内容的想法。我不知道你想如何处理数字/字母问题,并且你想要在参数上添加范围检查。您还需要测试正确性。但它显示了将char值放在一个字符串中并使用它来向两个方向查找的想法。给定一个int值,它将尽可能快。给定一个char来进行反向查找,我预计,它也会非常快。

public class Baudot {
    public const char Null = 'n';
    public const char ShiftToFigures = 'f';
    public const char ShiftToLetters = 'l';
    public const char Undefined = 'u';
    public const char Wru = 'w';
    public const char Bell = 'b';
    private const string Letters = "nE\nA SIU\rDRJNFCKTZLWHYPQOBGfMXVu";
    private const string Figures = "n3\n- b87\rw4',!:(5\")2#6019?&u./;l";

    public static char? GetFigure(int key) {
        char? c = Figures[key];
        return (c != Undefined) ? c : null;
    }

    public static int? GetFigure(char c) {
        int? i = Figures.IndexOf(c);
        return (i >= 0) ? i : null;
    }

    public static char? GetLetter(int key) {
        char? c = Letters[key];
        return (c != Undefined) ? c : null;
    }

    public static int? GetLetter(char c) {
        int? i = Letters.IndexOf(c);
        return (i >= 0) ? i : null;
    }
}

您可能还想修改我定义为常量的特殊字符的简单处理。例如,使用char(0)表示null,使用ASCII bell表示bell(如果有这样的话)。我只是用快速的小写字母进行演示。

我使用了可以为空的返回值来证明没有找到某些东西的概念。但是如果给定的int值没有映射到任何东西,则返回Undefined常量可能更简单,如果给定的char不在Baudot字符集中,则返回-1。