4

我正在尝试从十六进制字符串编写二进制文件。例如,如果我的十六进制字符串是C27EF0EC,那么十六进制文件应该包含、和的ASCII字符。 我该怎么做?C27EF0EC
PHP

这是我尝试过的:

$s="";
for ($i=0; $i<count($h); $i++) {
    $s+=pack("C*", "0x".$h[$i]);
}
$f2=fopen("codes0", "wb+");
fwrite($f2, $s);
4

2 回答 2

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”。

于 2012-12-23T20:08:08.087 回答
0

假设该数组$binary是您希望按此确切顺序写入磁盘的先前构造的数组字节(如我的情况下的单色位图像素),则以下代码在运行 ubuntu 服务器 10.04 LTS 的 AMD 1055t 上为我工作。

我遍历了我可以在网上找到的每一种答案,检查输出(我使用了 shed 或vi,就像在这个答案中一样)来确认结果。

<?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";
?>
于 2013-08-18T01:55:50.860 回答