已更新
在我的应用程序中,我通过蓝牙与PCB进行连续通信。此通信由HEX Strings制作。
字符串格式如下:
2b(thread init), 05(write command), 09(bytes), 04(variable bytes), 5af2ff1f(memory location), 04a0bcf1(variable value), 7e(checksum)
此Hex字符串的功能是访问PCB的具体存储位置并写入值。
为了更容易,我们假设Hex字符串是:
hex_string= 2B05A82BF1
这个字符串,在通过蓝牙发送之前,我将其转换为字节[]。我需要的是创建一个检查我发送的所有字符串的函数。
我必须寻找的是字符串中的任何“2B”字节。这是因为PCB将“2b”读作“初始线程”值,如果字符串中有任何“2b”,则PCB会将其读作另一个线程的init,并且不会完全发送该字符串。
我不知道使用Hex String或将其转换为Byte []后是否更容易检查。
该函数将取消字符串的第一个“2b”并检查字符串中是否有另一个“2b”,如果是,则复制它,从而产生此结果。
before: hex_string= 2B05A82BF1
after: hex_string= 2B05A82B2BF1
这样PCB就可以理解“2b”不是初始线程值。
我想要做的是检查所有字符串中包含“2b”值的函数。但我不知道使用Hex字符串,转换为byte [] ...或者......以及如何执行此操作时更好。
答案 0 :(得分: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");
}
}
答案 1 :(得分: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);
String 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);
}
答案 2 :(得分: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"
}
}
}
答案 3 :(得分:0)
好吧,你的电话何时检查'2B'。找出在找到'2B'后你可以在哪里做某事。如果您决定在java中检查“2b”,可以通过
进行检查String result = "2B0509045AF2FF1F04A0BCF17E";
if(result.contains("2B"))
{
//do something
}
else
{
//do something else
}