PHP二进制转十六进制并带前导零

3
我有以下代码:

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

这段代码可以很好地工作,并且我得到了一个值为c00。

但是,当我尝试将000000010000转换时,我得到了值"10"。实际上,我想要所有前导零,以便最终结果为"010"。

我该怎么做?

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


你是否在寻找类似于 str_pad() 的东西? - hek2mgl
格式化字符串:http://php.net/manual/zh/function.sprintf.php - dev-null-dweller
@dev-null-dweller 注意,sprintf虽然好用,但真的很慢 - hek2mgl
也许我在这里漏掉了什么,但是你不能计算前导零。这只是一个格式问题。真的很想知道你的帖子(和被接受的答案)。请启发我。 - hek2mgl
3个回答

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

只是补充一下,如果你想处理不同长度的$binary,可以尝试这样做: - netgenius.co.uk

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

你应该根据 $binary 中的字符数使用 floor( strlen( $binary) / 4) 动态计算 $maxchars - nickb
在每个数字系统中,0==0。这不能被计算。这只是一个格式问题。 - hek2mgl
1
确实如此,但我完全不知道它与我的评论有什么关系。想象一下你的输入是 $binary = "0000000000000000000000000001";。你的解决方案失败了,因为正确的输出应该是 0000001而你得到的是 0001 - nickb
1
请重新阅读原帖:“我实际想要的是所有前导零…” - nickb
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/30026/discussion-between-hek2mgl-and-nickb - hek2mgl
显示剩余2条评论

1

你可以使用以下方式添加所需数量的前导零:

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

这段代码的作用是什么?

  1. 使用 strspn 函数找出二进制字符串前导零的个数。
  2. 将前导零的个数转换成十六进制表示法中所需的前导零数量。四个前导零位需要转换成一个零十六进制数字;任何剩余的零位已经编码在输出的第一个非零十六进制数字中,因此我们使用 floor 函数将它们舍去。
  3. 使用 str_repeat 函数在结果前添加相应数量的零。

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


抱歉,我编辑了我的评论,二进制字符串的长度可能会有所不同,因此填充量需要根据二进制的长度进行调整。 - Pryach
@MathewPatterson:这段代码通过检查二进制输入自动计算所需的前导零位数。试一下吧。 - Jon
@hek2mgl:翻译f到十进制数15的方式与翻译其他内容一样(需要注意的是,我明确提到的是数字而不是数值)。如果您不喜欢我的动词选择,我也可以接受更好的建议。 - Jon
好的,明白了。你的回答很好+1,但我仍然认为OP所要求的东西对我来说听起来很奇怪,因为即使只是一个1,它也会消耗PHP_INT_SIZE * 2 - 1(请查看我的更新后的回答)。 - hek2mgl
@hek2mgl:这对我来说听起来也很奇怪,但它可能是合法的。此外,这个要求是使整个事情不寻常和“有趣”的唯一因素。 :-) - Jon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接