首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bin2hex()切断尾随的零点

bin2hex()切断尾随的零点
EN

Stack Overflow用户
提问于 2019-07-03 16:27:59
回答 1查看 188关注 0票数 0

我有一个表单,在提交时将项插入到MySQL数据库中。我已经决定使用PHP中的random_bytes方法为项创建16位ID,这样每次表单提交时,我都已经知道ID,并且不必重新查询数据库中的ID。

为了将ID插入到页面中的链接中,我尝试使用bin2hex方法。这通常是正确的。但是,当ID有尾随零时,该方法似乎切断了它们(传入random_bytes方法的直接结果)。在其他页面中,在从数据库中检索到的相同ID上使用函数时,它不会这样做,而且工作正常。

换句话说,如果ID以1000结尾,则在数据库检索到的二进制表示上调用bin2hex时,十六进制表示形式将正确显示。但是,当对random_bytes函数的直接输出调用该函数时,十六进制表示中缺少零。

以下是初始代码:

代码语言:javascript
复制
$uuid = random_bytes(16);
$uuidHex = bin2hex($uuid);

稍后在同一脚本中:

代码语言:javascript
复制
$GLOBALS["ID"]  = '0x' . $uuidHex;

链接href属性内的脚本:

代码语言:javascript
复制
<?php echo $ID; ?>

下面是一个出现问题的示例ID:

0xa87ea4fc142fcdeasjf90j3771eda500

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-03 16:51:56

我们怎么知道bin2hex在切割尾随零点呢?

代码语言:javascript
复制
$uuid = random_bytes(16);

这是不可读的,这将给您密码强的随机字节。我们把它转换成十六进制。

代码语言:javascript
复制
$uuidHex = bin2hex($uuid); 

现在,这将给出32位的随机字符串,而不是16位。但是为什么呢?因为,在十六进制中,字节总是表示为两个字符。除以32除以2。同时,在字符串中添加“0x”,这将使其变为18位。要得到16位的结果,请执行以下操作

代码语言:javascript
复制
$uuid = random_bytes(7);
$uuidHex = bin2hex($uuid);
$GLOBALS["ID"]  = '0x' . $uuidHex; // 16 bit string 

因为使用random_bytes(7),我们得到7乘以2的字符串长度,即14,然后添加"0x“,使14 + 2 =成为16位字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56874513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档