【问题标题】:Check for a especific value inside a string检查字符串中的特定值
【发布时间】:2013-09-17 09:45:31
【问题描述】:

更新

在我的应用程序中,我通过蓝牙与 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”值的函数。但我不知道使用十六进制字符串是否会更好,当转换为字节 [] 时......或何时......以及如何做到这一点。

【问题讨论】:

  • 您只想检查字符串是否包含一些值。也许使用 substring() 就足够了?
  • 我已经用更详细的解释更新了这个问题
  • 如果我没记错的话,你会得到一个类似于 2BXXXXXX2BXXXX 的字符串,并且你希望它像 2BXXXXXX2B2BXXXX 一样改变
  • @Amith GC,就是这样!我不在乎是字符串格式还是字节 [] 格式。我需要的只是一个检查它内部的另一个“2b”的函数,如果有,复制它。
  • 当您将字符串转换为字节时...您发送的是 2B(十进制的 43)还是字符“2”和“B”的值?我问它是因为如果您发送“2b02b0”并且发送的是十六进制数字,则第二个 2b 不是 43,而是 02 (2) 和 b0 (-80)

标签: java android string bluetooth


【解决方案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");
    }
}

【讨论】:

  • 谢谢@Amith GC,我现在就试试。还有一件事。除此之外,输入字符串2BXX09XX2BYYYY 将导致这个2BXX09XX2B2BYYYY。 “09”值是整个字符串的字节数,因此在添加额外的“2B”时,我应该将“09”更改为“0A”以指示字符串的新长度。您能否将其也添加到您的示例中?
  • 09是字符串的长度,总是一样的。字符串的第一个值始终相同,最后一个值是其变化。所以我们不能像你检查 2B 那样做,因为它里面可能有另一个 09 表示一个值。因此,如果字符串包含“2b”并且我们复制它,我们现在必须将“09”更改为“0A”
  • 看看我更新的答案... 输入:2BXX09XX2BYYYY 输出:2BXX0AXX2B2BYYYY
  • 当然,让我在我的代码上试试吧 ;)。只是为了完成功能,您能否添加一个条件来检查:如果字符串中有 2B,它会执行所有这些操作,但如果没有,则保留字符串
【解决方案2】:
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);

        }

【讨论】:

  • 很好,您发布了一个类似的解决方案,但添加了 if 条件来检查其中是否有任何“2b”。假设它是字符串的字节长度,并且当得到带有重复的“2b”2B06A82B2BF1 的结果字符串时,现在字节长度将是@ 987654326@,所以这也必须改变。
【解决方案3】:

如果您正在获取字符串并将相关数字中的每一对字符转换为一个字节(例如,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" 
        }

    }
}

【讨论】:

  • 考虑到我有一个名为“hexToByte”的函数,它将十六进制字符串转换为字节[]。您将如何执行您提议的功能?
  • 而不是 hexToByte 我硬编码了一个字节数组 b,但在这里你有它
  • 虽然我认为这种方法比管理字符串更有效,但我会实现@Amith GC 的方法,因为它更适合我的代码结构,无论如何我会考虑你的方法以备将来使用修改。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2011-07-08
    • 2013-10-21
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多