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

带前导零的PHP二进制到十六进制,php,binary,hex,Php,Binary,Hex,我有以下代码: <? $binary = "110000000000"; $hex = dechex(bindec($binary)); echo $hex; ?> 这很好,我得到的值是c00 但是,当我尝试转换0000000 10000时,我得到了值“10”。我想要的是所有的前导零,所以我可以得到“010”作为最终结果 我该怎么做 编辑:我应该指出,二进制数的长度可以变化。因此,$binary可能是000011000,结果是08。您可以使用以下内容预先设置所需数量的前导零:

我有以下代码:

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

这很好,我得到的值是c00

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

我该怎么做


编辑:我应该指出,二进制数的长度可以变化。因此,$binary可能是000011000,结果是08。

您可以使用以下内容预先设置所需数量的前导零:

$hex = str_repeat("0", floor(strspn($binary, "0") / 4)).$hex;
这有什么用

  • 它会找出二进制字符串在strspn中有多少前导零
  • 它将此转换为十六进制表示形式上所需的前导零的数量。4个前导零位的整组需要翻译成一个零十六进制数字;任何剩余的零位都已编码到输出的第一个非零十六进制数字中,因此我们使用
    floor
    将其剔除
  • 它使用
    str\u repeat
    在结果前面加上那么多的零
  • 请注意,如果输入位数不是4的倍数,这可能会导致比预期少一个零十六进制数字。如果有可能,您需要进行相应的调整。

    使用:

    // 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中的可变位数,请执行以下操作:

      $fmt = '%0' . ((strlen($binary) + 3) >> 2) . 'x';
      $hex = sprintf($fmt, bindec($binary));
    

    您是否正在搜索类似于
    str_pad()
    ?格式化字符串:@dev null居住者请注意,sprintf很好,但确实很慢。可能我这里缺少一些内容,但您无法计算前导零。这只是一个格式问题。真的很想知道你的帖子(和被接受的答案)。请注意,我编辑了我的注释,二进制字符串的长度可能不同,因此填充量需要根据二进制的长度进行更改。@MathewPatterson:此代码自动计算检查二进制输入所需的前导零数。试试看。哦,对不起,我想我根本没试过,只是觉得我不够具体!谢谢<代码>需要将4个前导零位的整组翻译成一个零十六进制数字。你如何翻译a
    0
    ?@hek2mgl:与你翻译例如a
    f
    到十进制数字序列15的方式相同(请注意,我明确地说的是数字,而不是数字,到处都是)。如果你不喜欢我选择的动词,我愿意接受更好的建议。你应该根据
    $binary
    中的字符数,在每个数字系统中使用
    floor(strlen($binary)/4)
    0==0
    动态计算
    $maxchars
    。这是无法计算的。这只是一个格式问题,但我完全不知道这和我的评论有什么关系。假设您的输入是
    $binary=“000000000000000000000 1”。您的解决方案失败,因为正确的输出是
    0000001
    <代码>00000000000000000000001==1
    仅此而已。你能解释一下,你是如何计算的吗?重读OP:我实际上想要的是所有的前导零…只是想加上,如果你想处理不同长度的$binary,那么类似这样:
      $fmt = '%0' . ((strlen($binary) + 3) >> 2) . 'x';
      $hex = sprintf($fmt, bindec($binary));