将字节数组位置设置为任意整数值

时间:2015-02-20 18:05:51

标签: php

我正在实施AES加密算法,我需要想出一种方法来增加我的iv。我抓住了一个非常简单的问题:

如果我有一个随机生成的16字节数组,如何将特定字节设置为任意值?

例如,假设我只想将我的最低有效字节设置为0xff:

<?php

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes) . "<br>";

$bytes[15] = 0xff; // arbitrarily set this byte
echo bin2hex($bytes) . "<br>";

?>

这会产生这样的输出(显然是错误的):

  

9299dd089611fa47f130c4e92aaa09dc
  9299dd089611fa47f130c4e92aaa0932

我试图接受这个输出:

  

9299dd089611fa47f130c4e92aaa09ff

我已经在这里工作了几个小时,我无法弄明白。有人可以帮忙吗?谢谢。

编辑:我还试图像这样输出数组: echo var_dump(unpack('C*', $bytes));

这会产生这样的输出(这些数字不会与你上面看到的相交,但只关注最后一个字节):

  

array(16){[1] =&gt; int(242)[2] =&gt; int(106)[3] =&gt; int(88)[4] =&gt; INT(109)   [5] =&GT; int(145)[6] =&gt; int(251)[7] =&gt; int(38)[8] =&gt; int(54)[9] =&gt;   int(39)[10] =&gt; int(61)[11] =&gt; int(175)[12] =&gt; int(183)[13] =&gt; INT(27)   [14] =&GT; int(98)[15] =&gt; int(13)[16] =&gt; int(106)}

数组(16){   [1] =&GT; int(242)[2] =&gt; int(106)[3] =&gt; int(88)[4] =&gt; int(109)[5] =&gt;   int(145)[6] =&gt; int(251)[7] =&gt; int(38)[8] =&gt; int(54)[9] =&gt; INT(39)   [10] =&GT; int(61)[11] =&gt; int(175)[12] =&gt; int(183)[13] =&gt; int(27)[14] =&gt;   int(98)[15] =&gt; int(13)[16] =&gt; int(50)}

不应该是最后一个字节显示

  

[16] =&GT; INT(255)

1 个答案:

答案 0 :(得分:2)

您应该使用字符串操作例程来操作原始字节数组。见Byte manipulation in PHP

尝试:

$bytes = substr_replace ($bytes, chr(0xFF), 15 , 1);

还可以尝试:

$bytes[15] =  chr(0xff)