Найти конкретные символы в массиве байтов?

Я подключаюсь к эмулятору терминала, используя библиотеку в android, это подключается к последовательному устройству (коммутатору) и показывает мне отправленные/полученные данные.

Однако я просто пересылаю массивы байтов и обратно, поэтому я не знаю, в каком состоянии находится переключатель, заключается ли он в том, чтобы включить больше или режим конфигурации и т. Д. Это приводит меня к возможности ввода команд в неправильном режиме, и они не будут работать , Затем коммутатор находится в неустранимом режиме, поскольку я отправил неправильную команду, и нет способа удалить ее или перейти к новой строке. Проблема, с которой я сейчас пытаюсь справиться, - это тот, где я не знаю, в каком режиме находится переключатель. Я знаю, что после отправки команды я могу получить три разных запроса возврата:

switch>
switch#
switch(config)#

So I was thinking that if I read the last two characters received I could tell which mode I'm in. h>, h# and )#

Я получаю данные обратно в этом методе, всякий раз, когда данные получены, это выполняется:

public void onDataReceived(int id, byte[] data) 
{

    String str = new String(data);
    ((MyBAIsWrapper) bis).renew(data);

    mSession.write(str);
    mSession.notifyUpdate();
    viewHandler.post(updateView);
}

Would the best way to do this be search the byte array somehow or to convert it to a string and search the string for h>, h# and )#, then I could set a global variable depending on the value I get back? Maybe search from the end backwards?

1
nl ja de
Я думаю, что преобразование его в String является самым простым и понятным способом. Я тоже сделаю это.
добавлено автор Andremoniy, источник
Почему нужно указывать, я никогда не кодировал строку, извиняясь за невежество. Так я бы кодировал его как ascii? UTF8? Как эти варианты влияют на меня?
добавлено автор Paul, источник
ну, похоже, они находятся в десятичной форме, так как десятичные числа на диаграмме ascii соответствуют числам, которые я получаю, когда смотрю на письмо рядом с ним. Я не уверен, что делать. я буду читать об этом.
добавлено автор Paul, источник
Преобразуя его в строку, не забудьте указать кодировку.
добавлено автор jlordo, источник
@Paul: вам нужно декодировать полученные байты. Поэтому вам нужно знать, как они были закодированы терминалом.
добавлено автор MrSmith42, источник

2 ответы

Я бы поискал byte [] и избежал накладных расходов от преобразования в String .

Если более эффективный поиск начинается с конца, это зависит от данных, которые вы получаете. Я не могу судить об этом на небольшом примере, который вы опубликовали в своем вопросе.

Если вам нужно посмотреть только два последних символа:

if(data[data.length-2]=='h' && data[data.length-1]=='>')//"h>"


if(data[data.length-2]=='h' && data[data.length-1]=='#')//"h#"

Или, если это не так просто, используйте цикл для итерации массива.

Постскриптум Я предполагаю кодировку ASCII для кода выше

4
добавлено
Ну, я бы ввел команду, и могут быть возвращены тысячи символов, затем новая строка, затем приглашение. Так что да, я думаю, что это были бы последние два, которые были бы важны. Если я не буду думать о случае, когда они не будут последними двумя, и я могу использовать цикл. Ваш путь кажется разумным. Полагаю, я не должен переходить к строкам, если его легко избежать.
добавлено автор Paul, источник
Я проверил, и я возвращаю числа назад, 105 27, 91 74, поэтому я предполагаю, что это кодирование не так. Кажется, они не последние два байта, поэтому лучше всего петля.
добавлено автор Paul, источник
они просто мусор, отправленный обратно после того, как я вернусь. # Кажется, что это произойдет в конце всего, что я верну. Когда я отправлял данные на терминал, он не показывался, поэтому я не знал, что этот материал отправляется обратно. Если я отправлю данные в текстовое поле, я увижу все ошибочные символы, которые будут получены. Поэтому мне нужно будет зациклиться от конца назад, чтобы добраться до h #. В журнале я вижу много маленьких странных ящиков ['s и h. очень странно...
добавлено автор Paul, источник
Возможно, именно поэтому я получаю странные сообщения, я отправляю текст следующим образом: String enable = "enable" + System.getProperty ("line.separator"); sendOverSerial (enable.getBytes ()); Я преобразовываю строку в байт без какой-либо кодировки. Это терминал play.google.com/store/apps/ & hellip;
добавлено автор Paul, источник
Спасибо, я попытаюсь посмотреть, смогу ли я настроить это, если я не могу легко. У меня есть данные как строка, в которой я могу просто искать нужные символы. Конечно, я мог бы просто использовать десятичные числа, которые я верну, либо искать соответствующий. Думаю, я думаю, 104 и 35.
добавлено автор Paul, источник
Спасибо, я просто ищу их.
добавлено автор Paul, источник
Только 4 байта? Знаете ли вы, что они должны понимать? Интерпретируются как ASCII, они i escape [J .
добавлено автор MrSmith42, источник
Это означает, что ваш терминал не использует ASCII. Поэтому вы должны узнать, какую кодировку/кодировку он использует.
добавлено автор MrSmith42, источник
Я думаю, что почти каждый эмулятор терминала может использовать ASCII (вам может понадобиться его настроить). Но учтите, что при использовании ASCII вы не можете передавать символы без ASCII.
добавлено автор MrSmith42, источник
h = 104, > = 62 и # = 35
добавлено автор MrSmith42, источник

Ты имеешь ввиду?

if(str.endsWith("h>") || str.endsWith("h#") || str.endsWith(")#"))

или проще

if(str.equals("switch>") || str.equals("switch#") || str.equals("switch(context)#"))

или с использованием регулярного выражения

final Pattern switched = Pattern.compile("switch(>|#|\\(\\w+\\)#)");

if(str.matcher(switched).matches())
2
добавлено
Спасибо, я думал о регулярном выражении и т. Д., Но мне нужно знать их отдельно для выполнения разных операций, поэтому я думаю, что слишком сложно беспокоиться о регулярном выражении и что ответа MrSmith42 будет достаточно.
добавлено автор Paul, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async

Android Rus
Android Rus
68 участник(ов)