PHPでは、 HexDec()関数は、16進数を小数点に変換するためによく使用されます。文字列パラメーターを取り、16進数を表し、対応する小数値を返します。ただし、いくつかの高度なアプリケーションシナリオを扱う場合、特に多バイト16進文字列を扱う場合、開発者はしばしばいくつかの質問に遭遇します。HexDec ()は、多バイトヘキサデシマル文字列の変換をサポートしていますか?それを使用するときに特別な注意が必要なことは何ですか?
PHPのHexDec()関数の構文は次のとおりです。
$dec = hexdec("1A");
echo $dec; // 出力 26
この関数は、文字列「1a」を16進数に解析し、小数整数26を返します。 「1a」や「1a」などのケース非感受性の有効な16進列である入力をサポートします。
「マルチバイト16進数文字列」はPHPでは正式な用語ではありませんが、実際に使用すると、開発者は暗号化されたデータ、色の値、UUID、またはネットワークプロトコルデータなどの処理を行うことができます。
$hex = "e4b8ade59bbd"; // UTF-8 エンコード“中国語”
このタイプの文字列は、通常、16進形式のバイナリデータを表すために使用されます。 2つの文字ごとに1つのバイトを表し、文字列全体は実際には複数のバイトの組み合わせです。
hexdec()の中核的な制限は、小数点以下の整数を返すことであり、64ビットシステムでのPHP整数の最大値は約9.22e18です(つまり、 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFこの範囲を超えると、 hexdec()は精度を失い、正しく解析することさえできません。
例えば:
$val = hexdec("FFFFFFFFFFFFFFFF"); // より多い PHP int の最大値
echo $val; // 予測不可能な結果(一部のシステムではネガティブ)
10進値を計算する代わりに、長い16進ストリング(MD5、SHA1ハッシュなど)をバイナリデータに復元することが目的である場合は、 pack()またはhex2bin()関数を使用する必要があります。
$hex = "e4b8ade59bbd";
$bin = hex2bin($hex);
echo $bin; // 出力原始二进制内容,ファイルまたはネットワーク転送の書き込みに使用できます
逆に、PHP整数範囲を超えた16進数の正確な処理が必要な場合は、GMPまたはBC Math拡張を使用する必要があります。
$hex = "FFFFFFFFFFFFFFFF";
$dec = gmp_strval(gmp_init($hex, 16), 10);
echo $dec; // 出力正确的十进制字符串
カラー処理:
$hexColor = "FF5733";
$r = hexdec(substr($hexColor, 0, 2));
$g = hexdec(substr($hexColor, 2, 2));
$b = hexdec(substr($hexColor, 4, 2));
HexDec()を呼び出す前に、2人の文字ごとに分割する必要があることに注意してください。
一意の識別子処理(UUIDなど) :
一度にuuid文字列全体をhexdec()に渡すことは避けてください。実際のニーズに応じて処理するか、特別なクラスライブラリを使用して解析する必要があります。
ファイルヘッダー分析、ネットワークプロトコル:
0x89504E47 (PNGファイルの署名)などのデータを処理する場合、10進数に直接ターンするのではなく、 unpack()およびビット操作を使用することをお勧めします。
互換性の考慮事項:
整数の精度は、さまざまなプラットフォームで異なります。文字列関数または高精度の数学ライブラリを使用して、クロスプラットフォームの一貫性を確保してください。
HexDec()は、 PHP整数の範囲内でより短い値で16進数の弦を変換するのに適した簡潔で効率的な関数です。しかし、より複雑な「多バイトの16進列」の場合、開発者は、精度の損失またはフォーマットエラーを回避するための目的に基づいて、より適切な関数または拡張機能を選択する必要があります。
実際のプロジェクトでは、 https://gitbox.net/api/uploadにbase64エンコードされたファイル署名を送信するなど、マルチバイトデータを16進形式の形式で渡す必要がある場合は、ヘックスデク()を使用する前にヘックスデク()を使用しようとする代わりに、最初に元のデータを正しくエンコードしてください。
正しい例:
$signature = "89504e470d0a1a0a"; // PNG ファイルヘッダー
$binary = hex2bin($signature);
$base64 = base64_encode($binary);
// 使用 curl アップロード
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file_signature' => $base64
]);
HexDec()の制限と代替案を理解することにより、開発者は16進数を含むデータ変換の問題をより安全かつ正確に処理できます。