我正在开发一款通过蓝牙与PCB通信的应用程序。我从应用程序发送到PCB HEX字符串,如下所示:
hex_string = 2b0509045af2ff1f5230a9072b
好吧,在此字符串中,这些值始终相同2b050904
,其他值代表5af2ff1f
内存位置,5230a907
变量值和2b
校验和。
开头的2b
代表thread init
,所以基本上我需要检查字符串中的其他2b
,因为如果有另一个,PCB会理解它作为另一个线程init,将分割整个字符串。
所以步骤是:
* Disregarding the 2b at the start, check for another 2b inside the string, and if it is,
duplicate it, so the PCB understands it this way.
* Afther duplicating the 2b, change the 09 in the non variable part of the string,
that indicates the string's byte length, with a 0a.
在此主题中讨论后:Check for a especific value inside a string
这是我用来实现这个目的的功能:
public static String manage2b (String s) {
String sNew = null;
String input = null;
if (s.contains("2b")) {
sNew = s.replaceFirst("2b", "");
}
if (sNew.contains("2b")) {
input = convertString(s);
input = replaceSize(input, "0a");
}
else {
input = s;
}
return input;
}
/**Changes the 09 for 0a as the string's byte length if there is a duplicated "2b"*/
private static String replaceSize (String input, String newSizeVal) {
int sizePosition = 4;
return input.substring(0, sizePosition) + newSizeVal + input.substring(sizePosition + newSizeVal.length(), input.length());
}
/**Duplicates the "2b" if there is another inside the string*/
public static String convertString (String input) {
String find2b = "2B";
int firstIndex = input.indexOf(find2b) + find2b.length();
return input.substring(0, firstIndex) + input.substring(firstIndex, input.length()).replace(find2b, "2B2B");
}
我已经使用调试器检查了该函数,并且字符串与示例的字符串非常相似,它正确地将09
更改为0a
,但它不会复制{ {1}}。所以,我认为在这样做的过程中,也许我宣布了一些错误,或者我在某个地方犯了错误。
答案 0 :(得分:0)
是的......“2b”与“2B”不同......改变它......我认为它会在那之后起作用......(我不能发表评论......抱歉..)
答案 1 :(得分:0)
如果String不查找大小写匹配似乎是正确的。
答案 2 :(得分:0)
另外,你是否需要检查一个单独的“2b”或者可能有几个? while(s.contains(“2b”)|| s.contains(“2B”))
可以帮助你。
案例敏感度:
org.apache.commons.lang3.StringUtils.containsIgnoreCase(“ABCDEFGHIJKLMNOP”,“gHi”);
可以帮助你,所以:
import org.apache.commons.lang3.StringUtils; ...
while(StringUtils.containsIgnoreCase(s,“2b”))...
应该解决这个问题。