2013-09-17 2 views
0

ОБНОВЛЕНОПроверьте наличие especific значения внутри строки

В моем приложении, у меня есть сплошная связь с печатной платой через Bluetooth. Это сообщение сделано HEX Strings.

Формат Строка, как это:

2b(thread init), 05(write command), 09(bytes), 04(variable bytes), 5af2ff1f(memory location), 04a0bcf1(variable value), 7e(checksum) 

Функция этой строки является Hex, чтобы получить доступ к конкретной ячейке памяти печатной платы и записать значение.

Чтобы сделать это проще, позволяет suppouse, что строка Hex является:

hex_string= 2B05A82BF1 

Эта строка, прежде чем отправить его через Bluetooth, преобразовать его в Byte []. Мне нужно создать функцию, которая проверяет все строки, которые я отправляю.

Что я должен искать, это для любого байта «2B» внутри строки. Это связано с тем, что печатная плата считывает значение «2b» как значение «init thread», и если в строке есть «2b», PCB будет читать ее как init другого потока, и строка не будет отправлена ​​полностью.

Не знаю, проще ли проверить это с помощью Hex String или после его преобразования в Byte [].

Функция должна состоять в том, чтобы сфотографировать первый «2b» строки и проверить, есть ли в строке другая «2b», и если это так, дублируйте ее, в результате чего это.

before: hex_string= 2B05A82BF1 
after: hex_string= 2B05A82B2BF1 

Таким образом, PCB понимает, что «2b» не является значением потока инициализации.

Что я хочу сделать, это функция, которая проверяет всю строку, содержащую значение «2b» внутри нее. Но я не знаю, лучше ли это делать с помощью строки Hex, когда она преобразуется в байт [] ... или когда ... и как это сделать.

+0

Вы просто хотите, чтобы проверить, если строка содержит несколько значений. Может быть, с помощью substring() достаточно? –

+0

Я уточнил вопрос с более подробным объяснением – masmic

+0

, если я не ошибаюсь, и получите строку что-то вроде 2BXXXXXX2BXXXX, и вы хотите, чтобы она изменилась, как 2BXXXXXX2B2BXXXX – amithgc

ответ

1

Это то, что вы ищете? не уверен ...

Вход: 2BXX09XX2BYYYY Выход: 2BXX0AXX2B2BYYYY

public class Temp { 

    public static void main (String args[]) { 
     String input = convertSting("2BXX09XX2BYYYY"); 
     input = replaceSize(input, "0A"); 

     System.out.println(input); 
    } 

    private static String replaceSize(String input, String newSizeVal) { 
     int sizePosition = 4; 
     return input.substring(0, sizePosition) + newSizeVal + input.substring(sizePosition + newSizeVal.length(), input.length()); 
    } 

    public static String convertSting (String input) { 
     String findString = "2B"; 

     int firstIndex = input.indexOf(findString) + findString.length(); 
     return input.substring(0, firstIndex) + input.substring(firstIndex, input.length()).replace(findString, "2B2B"); 
    } 
} 
+0

. Я обновил вопрос с помощью более подробное объяснение – masmic

+0

ответ обновлен! – amithgc

+0

Спасибо @Amith GC, я попробую прямо сейчас. просто еще одна вещь. Помимо этого, входная строка '2BXX09XX2BYYYY' приведет к этому' 2BXX09XX2B2BYYYY'. Значение «09» - это количество байтов всей строки, поэтому при добавлении дополнительного «2B» я должен изменить значение «09» на «0A», чтобы указать новую длину строки. Не могли бы вы добавить это тоже, к примеру? – masmic

0

ну, это ваш звонок, когда нужно проверить «2B». Выясните, где вы можете что-то сделать после нахождения «2B». Если вы решите проверить «2b» в java, вы можете сделать это на

String result = "2B0509045AF2FF1F04A0BCF17E"; 
if(result.contains("2B")) 
{ 
    //do something 
} 
else 
{ 
    //do something else 
} 
+0

. Я уточнил вопрос с более подробным объяснением. – masmic

1
public static void main(String[] args) 
{  
String str = "2B05A82BF1"; 
String strNew = ""; 
if (str.contains("2B")) 
{ 

strNew = str.replaceFirst("2B", ""); 
     } 

    int index = 0; 
    if (strNew.contains("2B")) 
{ 

index = strNew.indexOf("2B"); 
     } 

    strNew = str.substring(0, index + 4); 
      strNew = strNew + "2B" + str.substring(index + 4); 
      System.out.println(strNew); 

Строка tempStr = strNew.substring (2, 4);

int i= Integer.parseInt(tempStr); 
    //System.out.println(i); 
    i=i+1; 
    if(i<10) 
    { 
     strNew=strNew.replace(tempStr, "0"+ String.valueOf(i)); 
    } 
    else 
    { 
     strNew=strNew.replace(tempStr, String.valueOf(i)); 
    } 


    System.out.println(strNew); 

     } 
+0

O/P: 2B05A82B2BF1 – TheLostMind

+0

Хорошо, вы отправил аналогичное решение, но добавив условие if, чтобы проверить, есть ли в нем «2b», или нет. Как бы вы изменили, скажем, строку '2B05A82BF1',' 05', предположив, что это длина байта строки, и при получении результирующей строки с дублированным «2b» '2B06A82B2BF1' теперь длина байта будет' 06', поэтому это тоже нужно изменить. – masmic

+0

изменил код ..: P O/p: 2B06A82B2BF1 – TheLostMind

1

Если вы принимаете строку и преобразование каждой пары символов в соответствующий номер в один байт (например 2b0a10 будет трансформировать в [43, 10, 16]), я думаю, было бы легче проверить массив байтов, чем Строка одна: вам просто нужно найти номер 43 и вставить еще один. Я бы использовал ArrayList, чтобы добавить каждое значение байта, вставляя значение 43 (0X2B) два раза каждый раз, когда я нахожу его, а затем помещаю значения в равную array.

Проверка строки сложнее, потому что вам необходимо учитывать, что 2b02b0 на самом деле 2b, 02, b0, там нет значения «2b».

Пример:

public class Example { 

    public static byte[] parseOutput(byte[] output) { 
     ArrayList<Byte> aux= new ArrayList<Byte>(); 
     aux.add(output[0]); //we know the first value is 2b 
     for (int i=1;i< output.length;i++) { 
      aux.add(output[i]); 
      if (output[i]==0x2b) { 
       aux.add(output[i]); //added twice 
      } 
     } 
     //we cannot use toArray because autoboxing does not work 
     byte[] result= new byte[aux.size()]; 
     for (int i=1;i< aux.size();i++) { 
      result[i]=aux.get(i); 
     } 
     return result; 
    } 

    public static void main(String[] args) { 

     byte[] b={43,11,11,43,15}; 

     byte[] result=parseOutput(b); 
     for (byte data: result) { 
      System.out.print(Integer.toHexString(data)+" "); // shows "0 b b 2b 2b f" 
     } 

    } 
} 
+0

Учитывая, что у меня есть функция, называемая hexToByte, которая преобразует шестнадцатеричную строку в байт []. Как бы вы выполняли функцию, которую вы предлагаете? – masmic

+0

Вместо hexToByte я жестко закодировал байтовый массив b, но здесь у вас есть –

+0

Хотя я считаю этот метод более эффективным, чем управление строками, я буду применять метод @Amith GC, потому что он лучше подходит для структуры моего кода, во всяком случае, я буду учитывать ваш метод для будущих модификаций. – masmic

Смежные вопросы