Преобразование строки в данные из справочной таблицы - PullRequest
1 голос
/ 08 ноября 2011

У меня есть программа, которую я написал, которая имеет 26 массивов int, представляющих буквы алфавита. Каждый из них содержит 5 двоичных чисел, которые представляют огни, которые будут гореть на дисплее. Что мне нужно сделать, это преобразовать строку в двоичные данные. Например, если вы посмотрите на код ниже:

int B[] = {B1111111, B1001001, B1001001, B0110110, B0000000};
int O[] = {B0111110, B1000001, B1000001, B0111110, B0000000};

Итак, если строка была "BOB", мне нужно создать массив, который будет выглядеть примерно так:

int CurrentWord[] = {B1111111, B1001001, B1001001, B0110110, B0000000, B0111110, B1000001, B1000001, B0111110, B0000000, B1111111, B1001001, B1001001, B0110110, B0000000};

Я вижу, может быть, это делается с помощью нескольких переключателей, но должен быть лучший способ.

PS, я знаю, что мой код в цели c, я хочу сделать это в C #

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Это работа для массива массивов.

Цель C

int[][] map = new int[26][];
map[0] = {B0000000, B0000000, B0000000, B0000000, B0000000}; // Letter "A"
map[1] = {B1111111, B1001001, B1001001, B0110110, B0000000}; // Letter "B"
... Populate the array ...

Для поиска получить значение ASCII символа верхнего регистра (который будет от 64 до 90) и вычесть 64 и используйте это в качестве индекса массива:

char c = 'B';                   // char can be treated as an int
int index = toupper(c) - 'A';   // See the link above for an explanation
int[] result = map[ascii];      // Returns the map for "B"

Очевидно, чтобы завершить это, вам нужно было бы перебрать все символы и скопировать каждый результат в ваш вывод.

NSString *myString = [NSString stringWithString:@"Tanner"];
unichar c;
for(int i=0; i<[myString length]; i++) {
    c = [myString characterAtIndex:i];
                                    // char can be treated as an int
    int index = toupper(c) - 'A';   // See the link above for an explanation
    int[] result = map[ascii];      // Returns the map for "B"

    ... Append the result to a list of results ...
}

Прошу прощения за любые проблемы с синтаксисом в Objective-C, вопрос помечен C #, поэтому мне пришлось адаптироваться к Objective-C.

Обновление: C #

В C # это намного прощеКонцепция остается прежней, но код гораздо аккуратнее.

public static class Lights
{
    public static byte[] Encode(string input)
    {
        // Convert to ASCII values, get the map, and flatten it:
        return input.ToUpper().SelectMany(c => map[c-65]).ToArray();
    }

    // Note: C# does not have Binary Literals, so here's an alternative:
    private const byte B0000000 = 0, B0000001 = 1, B0000010 = 2, B0000011 = 3, B0000100 = 4, /* ETC */ B1111111 = 127, B1001001 = 73, B0110110 = 102, B0111110 = 126, B1000001 = 129;

    // Create the map:
    private static byte[][] map = new []{
                    /* A */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* B */ new[]{ B1111111, B1001001, B1001001, B0110110, B0000000 },
                    /* C */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* D */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* E */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* F */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* G */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* H */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* I */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* J */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* K */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* L */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* M */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* N */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* O */ new[]{ B0111110, B1000001, B1000001, B0111110, B0000000 },
                    /* P */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* Q */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* R */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* S */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* T */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* U */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* V */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* W */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* X */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* Y */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                    /* Z */ new[]{ B0000000, B0000000, B0000000, B0000000, B0000000 },
                };
}

Вот как получить результаты:

byte[] lights = Lights.Encode("BOB");

Несколько интересных замечаний: C # позволяет перебирать строку, как если бы она была массивом char, и позволяетВы выполняете математику, поэтому код очень прост.Ура!

0 голосов
/ 08 ноября 2011

Я думаю, что это работает:

void Main() {
    var s = ToBinary("BOB");
}
string ToBinary(string s) {
    var r = "";
    foreach (var c in s.ToCharArray()) {
        string w = "";
        for (int i = 1; i < 257; i = i << 1)
            w = ((c & i) > 0 ? "1" : "0") + w;
        r += "[" + w + "]";
    }
    return r;
}

результат

[01000010][01001111][01000010]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...