hex2bin($ var)错误:输入字符串必须是十六进制字符串

时间:2015-01-24 23:42:22

标签: php string int hex bin

你好,这是将字符串转换为十六进制和反向的小代码。

这个我们没有错误字符串到十六进制:

<?php
if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 'tmpcipher/'; // dossier où sera déplacé le fichier
    $tmp_file = $_FILES['fichier']['tmp_name'];
    if( !is_uploaded_file($tmp_file) )
    {

    }
    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];
    // on copie le fichier dans le dossier de destination
    $name_file = $_FILES['fichier']['name'];

    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
    {

    }
    $name_file2 = $_FILES['fichier']['name'];
    $hex = bin2hex(file_get_contents($content_dir . $name_file2));
    unlink($content_dir . $name_file2);
    $myfile2 = fopen($content_dir . $name_file2 . "2" , "w");
    $myfileurl = $content_dir . $name_file2 . "2";
    fwrite($myfile2, $str);
    fclose($myfile2);
    $myfile3 = $content_dir . $name_file2 . "2";
    if (file_exists($myfile3)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($myfile3));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($myfile3));
    readfile($myfile3);
}
}
?>

反过来,我们有一个错误:

<?php
if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 'tmpcipher/'; // dossier où sera déplacé le fichier
    $tmp_file = $_FILES['fichier']['tmp_name'];
    if( !is_uploaded_file($tmp_file) )
    {

    }
    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];
    // on copie le fichier dans le dossier de destination
    $name_file = $_FILES['fichier']['name'];

    if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
    {

    }
    $str0 = file_get_contents($content_dir . $name_file); //HEXADECIMAL CONTENT 
$hexstr1 = hex2bin("73616c7574"); //WORK
$hexstr2 = hex2bin($str0); //ERROR
    $name_file = substr($name_file,0,-1);
    $myfile2 = fopen($content_dir . $name_file, "w");
    fwrite($myfile2, $str0);
    fclose($myfile2);
    $filectohex = file_get_contents($content_dir . $name_file);
    $myfile3 = $content_dir . $name_file;
    if (file_exists($myfile3)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($myfile3));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($myfile3));
    readfile($myfile3);
}
}
?>

php_error_log:[2015年1月25日00:34:25欧洲/柏林] PHP警告:hex2bin():输入字符串必须是第47行的C:\ xampp \ htdocs \ dec.php中的十六进制字符串

当我获取$ str0的字符串内容并且我使用hex2bin时,它可以工作。 我不知道PHP是否认为我的var是整数,请给我解决方案:)

谢谢:D

[已解决]:将要转换的变量写入ascii(十六进制内容,然后将此文件的内容转换为ascii(必须为十六进制)。

$hex2bin($str0); ---> 
$myfile2 = fopen($content_dir . $name_file, "w");
fwrite($myfile2, $str0);
fclose($myfile2);
$myfile2path = $content_dir . $name_file;
$bin = hex2bin(file_get_contents($myfile2path));

2 个答案:

答案 0 :(得分:1)

在将文件内容写入另一个文件时遇到了类似的问题。然后,我读取了新文件。 尝试将十六进制字符串转换为十六进制时,出现消息“非十六进制字符串”。

PHP编写文件时,在每帧末尾都在其末尾添加了“ 00”(作为不可打印的字符,因此无法识别为“正常”字符串)。

要解决此问题,我发送了以下内容而不是原始帧:

$trame1_substring=substr($trame1,0,strlen($trame1)-2);

答案 1 :(得分:0)

您将$str写入文件,而不是$hex。该文件为空。您读取一个空字符串,hex2bin('')给出错误。它在这段代码中:

// below you define $hex
$hex = bin2hex(file_get_contents($content_dir . $name_file2));
unlink($content_dir . $name_file2);
$myfile2 = fopen($content_dir . $name_file2 . "2" , "w");
$myfileurl = $content_dir . $name_file2 . "2";
// but here you write $str
fwrite($myfile2, $str);

您可以通过简单回显$str0

的内容找到此信息
  

echo&#34; str0的内容是[$ str0] \ n&#34;