我是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)保存文件并将其发送回用户)
答案 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
或其他),然后使用substr
或the 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