0

ここには、保証または「いいえいいえ!」のいずれかが必要なコードがあります。私がこれについて正しい方法で考えているのか、それとも完全に間違った方法で考えているのかについて。

これは、特定の場所でバイナリ データの変数を切り取り、マルチバイトのオーバーロードされた関数を処理する必要があります。たとえば、substris reallymb_substrstrlenismb_strlenなどです。

私たちのサーバーはUTF-8内部エンコーディングに設定されているため、このバイナリデータ操作を回避するために、この奇妙な小さなことを行います。

// $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

バイナリデータなので、入出力結果を実際に表示することはできません。しかし、上記を使用したテストはうまく機能しているようで、何も壊れていません...

しかし、私の脳の一部は「何をしているの...これはこれを処理する方法ではありません」と叫んでいます!

ノート:

  • 入ってくるバイナリ データは、そもそもこれら 2 つの部分を連結したものです。
  • 最初の部分のサイズは常にわかっています (ただし、変更されます)。
  • 2 番目の部分のサイズはまったく不明です。
  • これは、暗号化にかなり近いもので、IV を前に詰め込んで、再び剥ぎ取っています (奇妙なことに、これと同じことを行う古いコードを見つけました笑)。

だから、私の質問は次のとおりだと思います:

  • これは実際に行っても問題ありませんか?
  • それとも、私が見落としている非常に明白なものがありますか?
4

2 に答える 2

1

しかし、私の脳の一部は「何をしているの...これはこれを処理する方法ではありません」と叫んでいます!

あなたの頭脳は正しいです。そもそも PHP でそれを行うべきではありません。:)

これは実際に行っても問題ありませんか?

コードの目的によって異なります。

そのようなバイナリをカットする頭のてっぺんの理由がわかりません。だから私の最初の本能は「いいえいいえ!」です。unpack()を使用して、バイナリを使用可能な変数に適切に解析します。

そうは言っても、理由でバイナリを分割する必要がある場合は、これで問題ないと思います。コードが機能していることをテストで確認できる限り、問題はありません。

補足として、私はこの種のユースケース、つまりデフォルトの文字列関数が必要な場合に正確に mbstring のオーバーロードを使用しません。

于 2017-11-09T18:02:34.487 に答える