3

我有以下代码:

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

哪个工作正常,我得到一个 c00 的值。

但是,当我尝试转换 000000010000 时,我得到的值是“10”。我真正想要的是所有前导零,所以我可以得到“010”作为最终结果。

我该怎么做呢?

编辑:我应该指出,二进制数的长度可能会有所不同。所以 $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. 它将其转换为十六进制表示所需的前导零的数量。整组 4 个前导零位需要转换为一个零十六进制数字;任何剩余的零位都已经编码在输出的第一个非零十六进制数字中,因此我们使用floor将它们排除在外。
  3. 它使用str_repeat.

请注意,如果输入位数不是 4 的倍数,这可能会导致比预期少一个零十六进制数字。如果有可能,您将需要相应地进行调整。

于 2013-05-15T22:46:07.453 回答