Как преобразовать целые числа ASCII в строку в Streambase?

Я использую streambase и создал карту для преобразования входящих целых чисел (0-255) в коды символов. Прямо сейчас я использую инструкции if/else вручную. Например:

    if (message_code == '106') then 
        message_code = 'J'
    else if (message_code == '110') then
         message_code= 'N'

Однако я бы хотел использовать это более широко. Насколько я мог судить, поиск по справке Streambase Studio ничего не дал. Я знаю, что это может быть сделано в Java, но, вероятно, потребует вызова внешней функции Java. Я не настолько компетентен в этом, поэтому немного растерялся.

Есть ли лучший способ сделать это в StreamBase?

1 ответ

Решение

Первоначальные исследования подтверждают, что язык выражений StreamBase или встроенные функции не имеют очевидного способа преобразования целых чисел, представляющих символьные значения ASCII, в односимвольную строку, соответствующую значению ASCII. Если позже я обнаружу неочевидный трюк, я вернусь и отредактирую этот ответ.

Я бы точно не использовал 255-выражение if/then/else!

Я бы, вероятно, использовал функцию Java, и вот пример, который я слегка протестировал:

package example;

public class ASCIIIntToString {

    public static String ASCIIToString(Integer a) {
        if (a == null || a < 0 || a > 255) {
            return null;
        } else {
            return Character.toString((char) (int) a);
        }
    }
}

И объявление пользовательской функции, которое нужно поместить в ваш sbd.sbconf, будет выглядеть так:

<custom-functions>
    <custom-function alias="ASCIIToString"
                     args="auto"
                     class="example.ASCIIIntToString"
                     language="java"
                     name="ASCIIToString"
                     type="simple"/>
</custom-functions>

Но если вы предпочитаете не заходить в Java и оставаться в EventFlow, на ум приходят два метода:

  1. Загрузите файл CSV с отображениями строк int -> в них в таблицу запросов и выполните поиск с помощью оператора Query Read, возможно, с помощью вкладки "Начальное содержимое" для ссылки на файл CSV, поскольку ASCII в ближайшее время не изменится.
  2. Создайте константу списка, скажем, ASCII, которая содержит все строки, в которые вы хотите преобразовать, и индексируйте список с помощью int. Например, в операторе Map выполните Add c ASCII[i] и добавьте логику проверки границ (возможно, в пользовательской функции).

Раскрытие информации / отказ от ответственности. Я являюсь сотрудником TIBCO Software, Inc. Мнения, высказанные здесь, принадлежат мне, а не компании TIBCO.

Другие вопросы по тегам