читать один байт из загруженного файла PHP - PullRequest
1 голос
/ 11 апреля 2011

Я очень новичок в 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). Я хочу распечатать код ACSCII (HEX) для этого байта. Как я могу это сделать? Нужно ли сохранять файл на сервер?

( Неограниченная цель - зашифровать файл и отправить зашифрованный файл обратно пользователю. Поэтому я хочу (1) загрузить файл (2) прочитать каждый отдельный байт (2) выполнить шифрование на байте Уровень (3) сохранить файл и отправить его обратно пользователю)

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

Несколько реализаций, я дам вам многократно используемую, используя fseek .

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

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

Я настоятельно рекомендую использовать move_uploaded_file перед использованием чего-либо $ _FILES.

PS Это может быть очень и очень дорого, если вы не будете осторожны, и я предлагаю вам прочитать большие куски, а затем выполнить операции с ними.

1 голос
/ 11 апреля 2011

Большое спасибо за «конечную цель» - это поможет нам убедиться, что вы не совершите глупостей случайно.

Шифрование - очень сложная тема. Вы не должны писать свою собственную процедуру шифрования. Используйте законченное, готовое решение.

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.
}

Это практично только для небольших файлов (меньше, чем несколько мегабайт), так как требует загрузки всего файла в память.

Я хочу распечатать код acscii (HEX) для этого байта

Вы можете получить десятичное значение 1045 *, используя ord, а затем преобразовать его в шестнадцатеричную строку, используя dechex:

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

После подстановки вы можете повернуть его вспять - используйте hexdec, чтобы перейти от шестнадцатеричного числа к десятичному, затем chr, чтобы перейти от десятичного числа к байту:

$converted_byte = chr(hexdec($ciphered_hex));
0 голосов
/ 11 апреля 2011

В PHP строка в основном представляет собой массив байтов, поэтому вы можете использовать функцию fread (), чтобы прочитать некоторые символы в строку, а затем получить доступ к отдельным байтам с помощью записи массива.Например,

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