php - 为什么,当我将字符串转换为二进制时,它会丢失第一个零?
问题描述
我尝试将任何字符串转换为二进制。但是如果二进制以零开头,它不会显示它。我所有的测试都给了我从第一个 1 到结束的二进制值。这是我的代码:
$value = unpack('H*', $MESSAGE);
$binary .= base_convert($value[1], 16, 2);
例如,当我尝试转换字符“%”时,它显示:100101 而不是:00100101
我是不是忘记了什么?
谢谢。亚辛
解决方案
不难看出,问题归结为以下几点:
为什么
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
.
推荐阅读
- arduino - Controling above 512 LED's with arduino and FASTLED
- javascript - 使用 setView 设置地图的适当大小
- c++ - Postcondition: this->get_id()==thread::id() in Boost
- django - 有没有办法在计算机之间共享本地 PostgreSQL?
- android - Unmarshalling unknown type code, List
& List - oracle - 如何将数据从 docker 卷复制到本地系统(Windows)
- laravel - Illuminate\Validation\ValidationException :给定的数据无效。在测试时尝试从响应中获取 json 时调用
- angular - In Angular 6 set div value from other div values
- typescript - TypeScript Typed Function void Should Not Compile
- amazon-s3 - apache nifi S3 PutObject stuck