在PHP中用Hex字符串写二进制数据

时间:2012-12-23 19:48:57

标签: php string hex fwrite

我正在尝试用十六进制字符串写一个二进制文件。 例如,如果我的十六进制字符串为C27EF0EC,那么hex文件应包含C27EF0和{{的 ASCII 字符1}}。
我如何在EC

中执行此操作

这是我尝试过的:

PHP

2 个答案:

答案 0 :(得分:2)

因此,您需要做的第一件事就是将您的单个字符串转换为包含str_split的双字符字符串数组。

$hex_bytes = str_split($h, 2);

然后,您希望将每个值从十六进制字符串转换为hexdec的相应数字。

$code_array = array_map(hexdec, $hex_bytes);

然后你想要与每个字符代码对应的字节值,你可以用chr获得:

$char_array = array_map(chr, $code_array);

最后,您希望将所有这些字节连接成一个字符串,您可以使用implode

$s = implode($char_array);

您可以按顺序使用上述步骤,也可以将它们组合成一个表达式,如下所示:

$s = implode(array_map(chr, array_map(hexdec, str_split($h,2))));

请注意,只要您获得高于0x7F的值,它就不再是“ASCII”。

答案 1 :(得分:0)

假设数组$binary是一个先前构造的数组字节(就像我的情况下的单色位图像素),你想要按照这个确切的顺序写入磁盘,下面的代码在运行ubuntu的AMD 1055t上适用于我server 10.04 LTS。

我迭代了我在网上找到的每一种答案,检查输出(我使用了棚子或vi, like in this answer)来确认结果。

<?php
$fp = fopen($base.".bin", "w");
$binout=Array();
for($idx=0; $idx < $stop; $idx=$idx+2 ){
    if( array_key_exists($idx,$binary) )
        fwrite($fp,pack( "n", $binary[$idx]<<8 | $binary[$idx+1]));
    else {
        echo "index $idx not found in array \$binary[], wtf?\n";
    }
}
fclose($fp);
echo "Filename $base.bin had ".filesize($base.".bin")." bytes written\n";
?>