在PHP中从十六进制字符串写入二进制数据

4
我将尝试从十六进制字符串编写二进制文件。 例如,如果我的十六进制字符串是C27EF0EC,那么该hex文件应包含C27EF0ECASCII字符。
我该如何在PHP中实现此操作?
这是我所尝试的:
$s="";
for ($i=0; $i<count($h); $i++) {
    $s+=pack("C*", "0x".$h[$i]);
}
$f2=fopen("codes0", "wb+");
fwrite($f2, $s);

你尝试过什么?(http://whathaveyoutried.com) - Mark Reed
我相信你可能会在这里找到答案。 - Taicho
@MarkReed 我已将其编辑到我的帖子中。 - gskartwii
@Taicho 我不是那个意思。 - gskartwii
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”了。

还是一样。:( - gskartwii
那么你肯定做错了其他事情,因为那会产生与你的代码完全不同的结果。 - Mark Reed
你的代码将$h视为字符串数组而不是单个字符串。 - Mark Reed
1
出现以下错误: 注意:C:\xampp\htdocs\codebase\index.php 的第2106行中使用了未定义的常量chr,已默认为'chr'。 注意:C:\xampp\htdocs\codebase\index.php 的第2106行中使用了未定义的常量hexdec,已默认为'hexdec'。 - gskartwii
1
你必须使用旧版本的PHP。在函数参数中使用字符串:'chr','hexdec'等。 - Mark Reed
让我们在聊天中继续这个讨论。点击此处进入聊天室 - gskartwii

0
假设数组$binary是先前构建的字节数组(例如我的情况下的单色位图像素),您希望按照此确切顺序将其写入磁盘,则以下代码适用于我在运行Ubuntu Server 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";
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接