使用PHP以二进制形式保存十六进制数据无法正常工作

使用PHP以二进制形式保存十六进制数据无法正常工作,php,file,binary,hex,pack,Php,File,Binary,Hex,Pack,我正在学习PHP和文件,并试图编写一些将数据放入二进制文件的代码 这是我的密码: 写 阅读 缺少的字母如z、m、n或o在哪里 编辑6-3-14 7h36 am:如果可能,我希望.bin文件不是纯文本您正在尝试在char(C-无符号字符)指令中设置十六进制字符 echo "\t"; foreach( array('0x41', 65, 'a') as $o ) echo $o."\t"; echo "\n"; foreach( array('c*','C*','a*','A*','h*','H*'

我正在学习PHP和文件,并试图编写一些将数据放入二进制文件的代码

这是我的密码:

写 阅读 缺少的字母如
z
m
n
o
在哪里


编辑6-3-14 7h36 am:如果可能,我希望.bin文件不是纯文本

您正在尝试在char(C-无符号字符)指令中设置十六进制字符

echo "\t";
foreach( array('0x41', 65, 'a') as $o )
echo $o."\t";
echo "\n";
foreach( array('c*','C*','a*','A*','h*','H*','v*','n*','S*') as $o ){
    echo $o . "\t";
    foreach( array(0x41, 65, "a") as $oo ) {
        echo pack($o, $oo);
        echo "\t";
    }
    echo "\n";
}
若你们运行这个程序,你们会很快看到pack是如何使用3个不同的a值(十六进制、十二进制和正常值)的

您必须使用
h
指令来完成所需的任务

function writeToFile($data) {
    $fp = fopen(FILENAME, 'wb');
    $len = strlen($data);
    for ($i = 0; $i < $len; ++$i) {
        $hx = dechex(ord($data[$i]));
        $result = fwrite($fp, pack("h*", $hx));
        if(!$result) {
            // show something
        }
    }
    fclose($fp);
}
现在,创建字符串并写入文件:

$data = 'This should work properly, thanks for StackOverFlow!';
$len = strlen($data);
writeToFile($data);
然后读回:

echo readFromFile($len);
文件内容如下所示:

E<86><96>7^B7<86>öWÆF^Bwö'¶^B^G'ö^GV'Æ<97>Â^BG<86>^Væ¶7^Bfö'^B5G^V6¶ôgV'dÆöw^R
E7^B7öWÆF^Bwö^ B^GöGVÆBG^Væ7^BföB5G^V6ÆGVÆR
function writeToFile($data) {
    $fp = fopen(FILENAME, 'wb');
    $len = strlen($data);
    for ($i = 0; $i < $len; ++$i) {
        $hx = dechex(ord($data[$i]));
        $result = fwrite($fp, pack("h*", $hx));
        if(!$result) {
            // show something
        }
    }
    fclose($fp);
}
function readFromFile($lenght, $pos = 0) {
    $return = '';
    $fp = fopen(FILENAME, 'rb');
    if(!$fp) {
        // show something
    }
    $fseek = fseek($fp, $pos, SEEK_SET);
    if($fseek == -1) {
        // show something
    }
    $data = fread($fp, $lenght);
    $data = unpack("h*", $data);
    $arr = str_split(current($data), 2);
    foreach($arr as $val) {
        $return .= chr(hexdec($val));
    }
    return $return;
}
$data = 'This should work properly, thanks for StackOverFlow!';
$len = strlen($data);
writeToFile($data);
echo readFromFile($len);
E<86><96>7^B7<86>öWÆF^Bwö'¶^B^G'ö^GV'Æ<97>Â^BG<86>^Væ¶7^Bfö'^B5G^V6¶ôgV'dÆöw^R