0

更新

在我的应用程序中,我通过蓝牙与 PCB 进行持续通信。这种通信是由 HEX 字符串进行的。

字符串格式是这样的:

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

这个Hex字符串的作用是访问PCB的一个具体内存位置并写入一个值。

为了更容易,让我们假设十六进制字符串是:

hex_string= 2B05A82BF1

这个字符串,在通过蓝牙发送之前,我将它转换为一个字节[]。我需要创建一个函数来检查我发送的所有字符串。

我必须寻找的是字符串中的任何“2B”字节。这是因为 PCB 将“2b”读取为“init thread”值,如果字符串中有任何“2b”,PCB 会将其读取为另一个线程的 init,并且不会完全发送字符串。

我不知道是否更容易使用十六进制字符串或将其转换为字节 [] 之后进行检查。

该函数将丢弃字符串的第一个“2b”并检查字符串内是否还有另一个“2b”,如果是,则复制它,从而产生此结果。

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

这样,PCB 就知道“2b”不是初始化线程值。

我想要做的是检查所有字符串中是否包含“2b”值的函数。但我不知道用十六进制字符串执行此操作是否更好,何时转换为 byte[]... 或何时... 以及如何执行此操作。

4

4 回答 4

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");
    }
}
于 2013-09-17T10:05:31.687 回答
1

如果您正在获取字符串并将相关数字中的每一对字符转换为一个字节(例如2b0a10将转换为[43, 10, 16]),我认为检查字节数组比检查字符串更容易:您只需要搜索编号 43 并插入另一个。我会使用 anArrayList添加每个字节值,每次找到一个值时插入值 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" 
        }

    }
}
于 2013-09-17T12:13:26.083 回答
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);

        }
于 2013-09-17T11:02:32.540 回答
0

好吧,这是您何时检查“2B”的电话。在找到“2B”之后,找出你可以在哪里实际做某事。如果你决定在java中检查'2b',你可以这样做

String result = "2B0509045AF2FF1F04A0BCF17E";
if(result.contains("2B"))
{
    //do something
}
else
{
    //do something else
}
于 2013-09-17T09:54:13.183 回答