0

更新しました

私のアプリでは、Bluetooth を介して PCB と継続的に通信しています。この通信は HEX 文字列によって行われます。

文字列形式は次のようになります。

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

この 16 進文字列の機能は、PCB の具体的なメモリ位置にアクセスして値を書き込むことです。

簡単にするために、16 進文字列が次のようであると仮定しましょう。

hex_string= 2B05A82BF1

この文字列は、Bluetooth 経由で送信する前に、Byte[] に変換します。必要なのは、送信するすべての文字列をチェックする関数を作成することです。

私が探す必要があるのは、文字列内の「2B」バイトです。これは、PCB が「2b」を「init スレッド」値として読み取り、文字列内に「2b」がある場合、PCB はそれを別のスレッドの init として読み取り、文字列全体が送信されないためです。

これを Hex String で確認する方が簡単なのか、それとも Byte[] に変換した後に確認する方が簡単なのかはわかりません。

関数は、文字列の最初の「2b」を破棄し、文字列内に別の「2b」があるかどうかを確認し、存在する場合はそれを複製して、この結果になります。

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

このようにして、PCB は「2b」が初期スレッド値ではないことを認識します。

私がやりたいのは、すべての文字列に「2b」値が含まれているかどうかをチェックする関数です。しかし、バイト[]に変換するとき...またはいつ...そしてそれを行う方法.

4

4 に答える 4

1

文字列を取得し、関連する数値の文字のすべてのペアを 1 バイトに変換する場合 (たとえば2b0a10、変換する場合[43, 10, 16])、文字列よりもバイト配列を確認する方が簡単だと思います:番号 43 を挿入し、別のものを挿入します。を使用しArrayListてすべてのバイト値を追加し、値 43 (0X2B) を見つけるたびに 2 回挿入してから、値をプレーン に入れます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

これはあなたが探しているものですか?わからない...

入力: 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 に答える
0

まあ、いつ「2B」をチェックするかはあなた次第です。「2B」を見つけた後、実際に何かを実行できる場所を見つけます。Javaで「2b」をチェックすることにした場合は、次の方法で実行できます

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