我正在尝试在.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位集。
答案 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。