Symfony 2.3 nextBytes()没有返回预期的结果

Pat*_*ign 2 api-key symfony

Symfony 2真的很新.我正在尝试实现secureRandom类和nextType(int)来生成一个32 char随机字符串.但是,该方法似乎返回非标准字符(UTF8).

码:

use Symfony\Component\Security\Core\Util\SecureRandom;

$generator = new SecureRandom();
$random = $generator->nextBytes(32);

...
Run Code Online (Sandbox Code Playgroud)

结果:

#ïŽ+cÐÁ-ˆ5FZ{CD:­ïN2¨x…3ß,î2
Run Code Online (Sandbox Code Playgroud)

有没有办法指定我只想要标准的英文字符?先感谢您!

Cha*_*ase 17

通过源代码展望https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Core/Util/SecureRandom.php 似乎在默认情况下此功能尝试使用OpenSSL的功能openssl_random_pseudo_bytes生成字节.因此,要获得此十六进制版本,您可以调用bin2hex.

use Symfony\Component\Security\Core\Util\SecureRandom;

$generator = new SecureRandom();
$random = $generator->nextBytes(32);
$humanReadableString = bin2hex($random);
Run Code Online (Sandbox Code Playgroud)

或保存变量赋值并将其翻译为1步:

$random = bin2hex($generator->nextBytes(32));
Run Code Online (Sandbox Code Playgroud)

每个字节由8位组成.AKA 0或1(二进制,基数2).

每4位可由1个十六进制值(基数16)表示.

因此,如果您要求1个字节(8个字符)说"11101001",那么将其转换为十六进制将为您提供"E9"(2个字符).

为了使用nextBytes获取随机的32个字符串,您需要将16字节的数据转换为十六进制值.