首页 > 解决方案 > 为什么,当我将字符串转换为二进制时,它会丢失第一个零?

问题描述

我尝试将任何字符串转换为二进制。但是如果二进制以零开头,它不会显示它。我所有的测试都给了我从第一个 1 到结束的二进制值。这是我的代码:

$value = unpack('H*', $MESSAGE);    
$binary .= base_convert($value[1], 16, 2);

例如,当我尝试转换字符“%”时,它显示:100101 而不是:00100101

我是不是忘记了什么?

谢谢。亚辛

标签: php

解决方案


不难看出,问题归结为以下几点:

为什么base_convert($value[1], 16, 2)不对结果进行零填充?

原因是base_convert将第一个参数解释为数字(例如,不是字节串);它在达到最高有效位后停止转换字节:

static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
char buf[(sizeof(zend_ulong) << 3) + 1];
char *ptr, *end;
zend_ulong value;

if (Z_TYPE_P(arg) != IS_LONG || base < 2 || base > 36) {
    return ZSTR_EMPTY_ALLOC();
}

value = Z_LVAL_P(arg);

end = ptr = buf + sizeof(buf) - 1;
*ptr = '\0';

do {
    *--ptr = digits[value % base];
    value /= base;
} while (ptr > buf && value);

return zend_string_init(ptr, end - ptr, 0);

(即当value变为零时。)行为是正确的,因为可以在最高有效位之后添加任意数量的零而不改变结果,例如100101等于00100101

该函数没有影响结果格式的参数。因此,为了获得所需的输出,您需要使用其他功能,例如sprintf.


推荐阅读