1

我对PHP很陌生,所以请原谅我的无知。

我有用于上传的 HTML:

<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)。我想打印出这个字节的 ascii (HEX) 代码。我怎么做?我需要将文件保存到服务器吗?

不理想的目标是加密文件并将加密的文件发送回用户。所以我想(1)上传文件(2)读取每个单独的字节(2)在字节级别执行加密(3)保存文件并发送它返回给用户)

4

3 回答 3

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 。

PS 如果你不小心,这可能会变得非常非常昂贵,我对你的建议是读取更大的块,然后对它们执行操作。

于 2011-04-11T01:25:38.107 回答
1

非常感谢您的“最终目标”——它将帮助我们确保您不会无意中做出愚蠢的事情。

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

Mcrypt是 PHP 最好的加密扩展。Mcrypt 支持多种常用密码,包括 AES(“Rijndael”)。 加密非常简单——对您的文件使用“CBC”模式


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

这解释了整个一次一个字符的事情。

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

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

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

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

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

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

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

替换后,您可以反转它 - 用于hexdec从十六进制到十进制,然后chr从十进制到字节:

$converted_byte = chr(hexdec($ciphered_hex));
于 2011-04-11T01:24:54.893 回答
0

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

$content = fread($_FILES["file"],10);
echo $content;
echo "byte10 is: ".$content[9]; // 9 because offset starts from 0
于 2011-04-11T01:33:30.037 回答