2017-11-09 14 views
0

Ich habe hier einen Code, den ich entweder Versicherung, oder "nein nein nein!" etwa in Bezug darauf, ob ich darüber richtig oder völlig falsch nachdenke.Umgang mit binären Daten und mb_function overloading?

Dies hat damit zu tun, eine Variable von Binärdaten an einer bestimmten Stelle zu schneiden, und auch mit Multi-Byte-überladenen Funktionen umzugehen. Zum Beispiel substr ist eigentlich mb_substr und strlen ist mb_strlen usw.

Unser Server ist auf UTF-8 interne Codierung und so Theres diese seltsame kleine Sache, die ich tue es für diese binäre Datenmanipulation zu umgehen:

// $binary_data is the incoming variable with binary 
// $clip_size is generally 16, 32 or 64 etc 
$curenc = mb_internal_encoding();// this should be "UTF-8" 
mb_internal_encoding('ISO-8859-1');// change so mb_ overloading doesnt screw this up 
if (strlen($binary_data) >= $clip_size) { 
    $first_hunk = substr($binary_data,0,$clip_size); 
    $rest_of_it = substr($binary_data,$clip_size); 
} else { 
    // skip since its shorter than expected 
} 
mb_internal_encoding($curenc);// put this back now 

Ich kann die Eingabe- und Ausgabeergebnisse nicht wirklich anzeigen, da es sich um Binärdaten handelt. Aber Tests mit den oben genannten scheinen gut zu funktionieren und nichts bricht ...

Allerdings schreien Teile meines Gehirns "Was machst du ... das kann nicht der Weg sein, damit umzugehen"!

Anmerkungen:

  • Die in den kommenden Binärdaten, ist eine Verkettung dieser beiden Teile zu beginnen.
  • Die Größe des ersten Teils ist immer bekannt (ändert sich aber).
  • Die Größe des zweiten Teils ist völlig unbekannt.
  • Dies ist ziemlich dicht in der Nähe der Verschlüsselung und stopfte die IV auf der Vorderseite und riss es wieder ab (was seltsamerweise fand ich einige alte Code, der das gleiche tut lol ugh).

Also, ich denke, meine Frage ist:

  • Ist das eigentlich in Ordnung tun werden?
  • Oder gibt es etwas sehr offensichtlich, das ich übersehe?
+0

Versuchen Sie, die Binärdatei in Variablen zu analysieren, um sie in Ihrem Code zu verwenden? Was ist der Zweck von $ first_hunk und $ rest_of_it? – rlanvin

+0

Der Endzweck ist ein bisschen unklar, auf den ich lieber nicht eingehen würde;) ... aber ich kann sagen, dass die erste und die zweite Variable am Ende zwei Teile der ursprünglichen binären Daten enthalten sollten Cliplänge) (was bei der Oddball-Methode gut ist). – IncredibleHat

+0

Ich habe einige Notizen über die Binärdatei hinzugefügt. – IncredibleHat

Antwort

0

MEINE LÖSUNG FÜR DIE SORGE

ich meine eigenen Fragen beantworten nicht mögen ... aber ich wollte teilen, was ich habe dennoch entschieden.

Obwohl was ich hatte, "arbeitete", wollte ich immer noch die Hack-Job-Änderung der Zeichensatzcodierung ändern. Es war alter Code, den ich zugeben muss, aber aus irgendeinem Grund habe ich nie hex2binbin2hex dafür angeschaut. Also habe ich beschlossen, es zu ändern, um diese zu benutzen.

Der resultierende neue Code:

// $clip_size remains the same value for continuity later, 
// only spot-adjusted here... which is why the *2. 
    $hex_data = bin2hex($binary_data); 
    $first_hunk = hex2bin(substr($hex_data,0,($clip_size*2))); 
    $rest_of_it = hex2bin(substr($hex_data,($clip_size*2))); 
    if (!empty($rest_of_it)) { /* process the result for reasons */ } 

die Hex-Funktionen verwenden, schaltet sich das Chaos in etwas mb wird nicht mit jeder Art und Weise schrauben. Eine 1 Million Bankschleife zeigte, dass der Prozess nicht beunruhigend war (und es sicherer ist, parallel zu sich selbst zu laufen als die mb_encoding mangle-Methode).

Also ich gehe mit diesem. Es sitzt besser in meinem Kopf und löst meine Frage für den Moment ... bis ich diesen alten Code in ein paar Jahren noch einmal bespreche und gehe "was habe ich mir dabei gedacht ?!".

1

jedoch Teile meines Gehirns schreien „was Sie tun ... das ist nicht die Art und Weise zu handhaben sein kann!“

Ihr Gehirn hat Recht, Sie sollten das in PHP überhaupt nicht tun. :)

Ist das eigentlich in Ordnung?

Es hängt vom Zweck Ihres Codes ab.

Ich kann keinen Grund von der Spitze meines Kopfes sehen, eine binäre so zu schneiden. Mein erster Instinkt wäre also "nein nein nein!" Verwenden Sie unpack(), um die Binärdatei ordnungsgemäß in verwendbare Variablen zu analysieren.

Das sagte, wenn Sie nur Ihre binary aus Gründen trennen müssen, dann denke ich, das ist in Ordnung. Solange Ihre Tests bestätigen, dass der Code für Sie arbeitet, sehe ich kein Problem.

Als eine Nebenbemerkung, verwende ich nicht Mbstring Überladung genau für diese Art von Anwendungsfall - d. H. Für immer wenn Sie die Standard-String-Funktionen benötigen.

+0

Rechts. Es ist die Multi-Byte-Überladung, die dieses Durcheinander anfing. Deshalb mache ich das Switchoverback. Ich arbeite in einigen bitweisen Operatoren herum, aber ich muss zugeben, dass binäre Manipulation keine meiner Stärken ist. – IncredibleHat

+1

Bitwise-Operatoren wie shift funktionieren nicht, da sie Operanden als Ganzzahl behandeln. – rlanvin