3

私は次のコードを持っています:

<?
$binary = "110000000000";
$hex = dechex(bindec($binary));
echo $hex;
?>

これは正常に機能し、c00 の値を取得します。

ただし、000000010000 を変換しようとすると、値「10」が得られます。私が実際に欲しいのはすべての先行ゼロであるため、最終結果として「010」を取得できます。

どうすればいいですか?

編集:指摘する必要があります、2 進数の長さは異なる場合があります。したがって、$binary は 00001000 の可能性があり、結果は 08 になります。

4

3 に答える 3

11

sprintfを使用すると、非常に簡単に実行できます。

// Get $hex as 3 hex digits with leading zeros if required. 
$hex = sprintf('%03x', bindec($binary));

// Get $hex as 4 hex digits with leading zeros if required. 
$hex = sprintf('%04x', bindec($binary));

$binary で可変数のビットを処理するには:

  $fmt = '%0' . ((strlen($binary) + 3) >> 2) . 'x';
  $hex = sprintf($fmt, bindec($binary));
于 2015-09-12T12:19:35.700 に答える
5

そのために使用str_pad()します:

// maximum number of chars is maximum number of words 
// an integer consumes on your system
$maxchars = PHP_INT_SIZE * 2; 
$hex = str_pad($hex, $maxchars, "0", STR_PAD_LEFT);
于 2013-05-15T22:48:25.883 に答える
1

次のようなものを先頭に必要な数のゼロを追加できます。

$hex = str_repeat("0", floor(strspn($binary, "0") / 4)).$hex;

これは何をしますか?

  1. バイナリ文字列の先行ゼロがいくつあるかを調べますstrspn
  2. これは、16 進数表現で必要な先行ゼロの数に変換されます。先頭の 4 つのゼロ ビットのグループ全体を 1 つの 16 進数のゼロに変換する必要があります。残りのゼロ ビットは、出力のゼロ以外の最初の 16 進数で既にエンコードされているため、 を使用floorしてそれらをキャストします。
  3. を使用して、その多くのゼロを結果に追加しstr_repeatます。

入力ビット数が 4 の倍数でない場合、16 進数のゼロが予想よりも 1 つ少なくなる可能性があることに注意してください。その可能性がある場合は、それに応じて調整する必要があります。

于 2013-05-15T22:46:07.453 に答える