从PHP上传的文件中读取单字节

时间:2011-04-11 01:20:23

标签: php file-upload readfile fread

我是PHP的新手,请原谅我的无知。

我有 HTML for for upload:

<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /><br />
<input type="submit" name="submit" value="Submit" />
</form>

我的PHP是(它不知道,但希望它显示我想要的):

<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  $content = fread($_FILES["file"],10);
  echo $content;
  echo "byte10 is: " ???
  }
?>

我想:从这个上传的文件中,我想读取一个字节(比如字节10)。我想打印出这个字节的acscii(HEX)代码。我怎么做?我是否需要将文件保存到服务器?

非常接近的目标是加密文件并将加密文件发送回用户。所以我想(1)上传文件(2)读取每个字节(2)执行加密字节级别(3)保存文件并将其发送回用户)

3 个答案:

答案 0 :(得分:2)

多个实现,我将使用fseek为您提供可重用的实现。

<?php
function getByte($f,$n){
    fseek($f,$n);
    return fread($f,1);
}

$f=fopen('your_file_path');
echo getByte($f,10);
?>

我强烈建议您在使用$ _FILES之前使用move_uploaded_file

P.S。如果你不小心的话,这可能会非常昂贵,我的建议是,阅读更大的块,然后对它们进行操作。

答案 1 :(得分:1)

非常感谢你的“终极目标” - 它将帮助我们确保你不会偶然做些傻事。

加密是一个非常复杂的主题。您不应该编写自己的加密例程。使用完整的预构建解决方案。

Mcrypt是PHP最好的加密扩展。 Mcrypt支持multiple common ciphers,包括AES(“Rijndael”)。 Encryption is pretty darn easy - 使用"CBC" mode作为您的文件。


Vigenère cipher是一个基于简单查找表的460岁的替代密码。

这解释了整个一个角色的事情。

虽然可以一次一个字节地读取整个文件,但您可能会发现使用字符串更方便。您可以将整个文件读入变量(通过file_get_contents或其他),然后使用substrthe square bracket substring syntax一次读取一个字节的字符串。请记住,PHP字符串只是简单的字节列表。

鉴于$data是文件中的完整数据,您可以这样处理每个字节:

$length = strlen($data);
for($i = 0; $i < $length; $i++) {
    $byte = $data[$i];
// Or
    $byte = substr($data, $i, 1);
// Process the byte here.
}

这仅适用于小文件(小于几兆字节),因为它需要将整个文件加载到内存中。

  

我想打印出这个字节的acscii(HEX)代码

您可以使用ord获取十进制值,然后使用dechex将其转换为十六进制字符串:

$hex_value = dechex(ord($byte));

替换后,你可以反转它 - 使用hexdec从十六进制到十进制,然后chr从十进制到另一个:

$converted_byte = chr(hexdec($ciphered_hex));

答案 2 :(得分:0)

在PHP中,字符串基本上是一个字节数组,因此您可以使用fread()函数将某些字符读入字符串,然后使用数组表示法访问单个字节。例如

$content = fread($_FILES["file"],10);
echo $content;
echo "byte10 is: ".$content[9]; // 9 because offset starts from 0