Probleme mit ReceiveFilter auf Datenaustausch

Teilweise ist es nicht möglich einen ReceiveFilter zu setzen.
IPS scheint Unicode im Datenaustausch nicht zu maskieren.
Grundsätzlich egal, bis man versucht auf diesen JSON-String einen ReceiveFilter zu setzen.

Es ist problemlos möglich in PHP mit der Option JSON_UNESCAPED_UNICODE ebenfalls so ein json zu erzeugen.

json_encode(utf8_encode($RAWBYTES),JSON_UNESCAPED_UNICODE)

Hier sind dann aber teilweise Zeichen enthalten, welche den ReceiveFilter stören.
Ist es nun ein Bug ?
Oder ein FeatureRequest um im Datenaustausch nur noch maskiertes Unicode zu bekommen ?

Michael

Hast du mal ein Beispiel für so einen Receive Filter? Der Receive Filter muss ja sauber UTF-8 Valide sein. Das sollte dann auch sauber klappen.

paresy

Hier Amazon Dasbutton auf windows rechner - Seite 2

Und hier
Amazon Dasbutton auf windows rechner - Seite 4

Wobei es im dort verlinkten Modul jetzt funktioniert.
Problem ist, das ich gerne das Ende vom Paket mit im Filter haben wollte.
Das letzte Byte ist immer xff und das funktioniert einfach nicht, egal was ich probiert habe.
Den Filter habe ich jetzt so bauen können (ohne EndZeichen)
$Mac = preg_quote(utf8_encode(hex2bin($Mac)), ‚\‘);
$Filter = ‚.\\u0001\\u0001\\u0006’ . '.‘ . $Mac . ‚.*‘;
Michael

Habe es weiter eingegrenzt.
Der IO in IPS sendet escaped Bytes immer mit Großbuchstaben => \u001D
Und JSON_Encode in PHP erzeugt immer Kleinbuchstaben => \u001d
Somit greifen die Filter nicht :frowning:

Gibt es eine Möglichkeit das Flag case insensitive zu setzen ?
Michael

Das wäre sicherlich Möglich. Ich weiß nur nicht, ob das ggf. bei anderen Leuten dann unerwartete Probleme macht. Kannst du den Filter nicht einfach im richtigen Casing setzen?

paresy

Wenn du mir den Parameter für json_encode bei PHP verrätst?
Oder kann RapidJson nicht identisch wie PHPs json das encodieren durchführen?

Ich kann ja nicht einfach den ganzen Filter mit strtoupper bearbeiten, dann haut es erst Recht nicht hin.

Beispiel zum testen:

Michael

Es funktioniert jetzt… aber toll ist das absolut nicht.

Ich wünsche mir da einen SetReceiveDataFilterEx($filter,$flags) :smiley:

Hier mal der Workaround-‚Mist‘.
Und dann macht RapidJson demnächst kleinbuchstaben bei Hex-Encode und ist stehe wieder da :rolleyes:


        $Mac = hex2bin($this->ReadPropertyString('Address'));

        $MacJSONencoded = array();
        for ($index = 0; $index < 6; $index++) 
        {
            // jedes Byte einzeln erst in einen JSON konformen String umwandeln, Anfang { und Ende } abschneiden 
            $MacJSONencoded[$index] = substr(json_encode(utf8_encode($Mac[$index]), JSON_UNESCAPED_UNICODE), 1, -1);
            // Wenn der JSON String 6 Zeichen lang ist, dann ist er \uxxxx encoded
            // Alles in Großbuchstaben wandeln und den falschen Anfang mit \U wegschneiden und \u wieder ankleben
            if (strlen($MacJSONencoded[$index]) == 6)
                $MacJSONencoded[$index] = '\\u' . substr(strtoupper($MacJSONencoded[$index]), 2);
        }
        $MacMatch = preg_quote(implode('', $MacJSONencoded), '\\');
        $Filter = '.*\\\\u0001\\\\u0001\\\\u0006' . '.*' . $MacMatch . '.*'; // Alles

Michael