PHP二进制到十六进制,带前导零

时间:2013-05-15 22:39:59

标签: php binary hex

我有以下代码:

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

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

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

我该怎么做?

编辑:我应该指出,二进制数的长度可以变化。所以$ binary可能是00001000,这将导致它08。

3 个答案:

答案 0 :(得分:5)

您可以使用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));

答案 1 :(得分:3)

使用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);

答案 2 :(得分:1)

您可以使用以下内容添加必需数量的前导零:

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

这是做什么的?

  1. 找出二进制字符串与strspn有多少前导零。
  2. 它将其转换为十六进制表示所需的前导零数。整组4个前导零位需要转换为一个零十六进制数字;任何剩余的零位都已经在输出的第一个非零十六进制数字中编码,因此我们使用floor将它们抛出。
  3. 它使用str_repeat预先在结果中添加了许多零。
  4. 请注意,如果输入位数不是4的倍数,则可能会导致一个比预期更少的十六进制数字。如果有可能,您需要相应调整。

相关问题