我正在尝试用十六进制字符串写一个二进制文件。
例如,如果我的十六进制字符串为C27EF0EC
,那么hex文件应包含C2
,7E
,F0
和{{的 ASCII 字符1}}。
我如何在EC
?
这是我尝试过的:
PHP
答案 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";
?>