RegEx bei Hexstring

Fohnbit

Top Contributor
Hallo!

Ich erhalte diesen Hexstring "0xa5ab23000f0003091e0019" als bytes in meinem Code aus einer OSGi Anwendung:
Java:
public void onInBytes(byte[] value) {
        calcRegEx(Base64.getEncoder().encodeToString(value));
    }

Ich möchte prüfen ob die Hex Zeichenfolge:
0x000f0003
in dem String existiert:
Java:
private void calcRegEx(String s) {
            Pattern pattern = Pattern.compile("\x00(.*)\x00\x03", Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(s);
            boolean matchFound = matcher.find();
}

Jedoch erhalte keinen Treffer.

Wenn ich es online teste, klappt es mit einem ähnlichen Regex:
 
Danke, das macht aber keinen Unterschied. Der regex klappt bei "normalen" Ascii" texte (also ohne Hex). Das Problem habe ich nur bei Hex Strings.

Beispiel:
\xa5(.*)\x23

Dieser regex klappt beim Online Check. Aber nicht bei mir in Java. Sollte 0xab ausgeben
 
Achso, ich muss zugeben ich habe deinen Code nicht vollstaendig gelesen:

Java:
Base64.getEncoder().encodeToString(value)

Da faellt ein Base64 String heraus, also zum Beispiel "SGVsbG8gV29ybGQK", kein Hex-String. Du kannst da auch nicht nach beliebigen Byte-Werten suchen, weil die sind ja alle Base64 enkodiert.

Eventuell waere es einfacher im byte[] nach den Werten zu suchen?
 
Generell ist meine Empfehlung bei sowas, immer genau anzeigen zu lassen, was man vergleicht. Also wirklich direkt den String ausgeben lassen.

Oder besser natürlich: Unit Tests! Wenn Du also Code hast, der aus einem Byte-Array ein String macht: Teste diesen! Dann ist auch klar, dass das heraus gekommen ist, das Du willst.
 
Danke. Scheinbar ist das pattern "x00" ein problem bei Strsings.

Ich habe dies gefunden:
Java:
public class ByteCharSequence implements CharSequence {

    private final byte[] data;
    private final int length;
    private final int offset;

    public ByteCharSequence(byte[] data) {
        this(data, 0, data.length);
    }

    public ByteCharSequence(byte[] data, int offset, int length) {
        this.data = data;
        this.offset = offset;
        this.length = length;
    }

    @Override
    public int length() {
        return this.length;
    }

    @Override
    public char charAt(int index) {
        return (char) (data[offset + index] & 0xff);
    }

    @Override
    public CharSequence subSequence(int start, int end) {
        return new ByteCharSequence(data, offset + start, end - start);
    }

}

und mit:
Java:
    Pattern pattern = Pattern.compile(getPropertyRgex(), Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(new ByteCharSequence(s));
            boolean matchFound = matcher.find();

erhalte ich einen Match. Aber nun habe ich das Problem das scheinbar die group(1) weder ein String noch ein Byte Array ist?
 
So, hab es nun geändert. Ich konvertiere das Byte Array in einen Hexstring. Wie oben erhalte ich dann:
a5ab23000f0003091e0019
als String.

In der Regex nutze ich dann nicht "\x00(.)\x00\x03" sondern nach "00(.)0003". Hexsuche also über Strings

Das klappt soweit ich gesehen habe!
 

Zurück
Oben