【问题标题】:PHP output buffering (ob_start, ob_flush)PHP 输出缓冲 (ob_start, ob_flush)
【发布时间】:2012-12-01 15:17:30
【问题描述】:

我之前使用 php 输出缓冲来从数据库创建 csv 文件,因为我不想创建现有文件,只是想让内容可下载。

CSV 是基于文本的文件,因此很容易通过这种方式创建,您可以设置标题并刷新文本内容。但!如果我想从十六进制数据创建一个 exe 怎么办? (项目是:我有一个现有的 exe 文件,我希望用户可以在 HTML 文本框中编写一些内容,然后将其转换为十六进制并将旧文本交换为新文本)

谢谢。

【问题讨论】:

  • 你知道要覆盖的exe文件中的字节范围吗?
  • 我愿意。总共大约 100-200 个字节

标签: php exe flush output-buffering ob-start


【解决方案1】:

使用以下代码通过从硬盘读取来下载exe文件。

<?php
$file = 'test.exe';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

【讨论】:

  • 但它是基于十六进制的吗?因为'我必须替换字节。
  • 你现在有一个 exe,你可以阅读它并使其可下载,但我必须从 exe 中获取十六进制内容,并以某种方式将其中的 100-200 字节与另一个十六进制内容交换。
  • 您可以使用 file_get_contents 读取文件内容并可以从中替换一些内容。我从未尝试过,但使用它似乎是可能的。
【解决方案2】:

如果你想替换二进制文件的一部分,例如从第 100 个字节到第 200 个字节,你可以使用 substr() 和 str_pad():

$binFile = file_get_contents('/pathto/exec/file.exec');
$replacedBinFile = substr($binFile, 0, 100) . str_pad(substr($_POST['text'], 0, 100), 100, "\x00") . substr($binFile, 200);
file_put_contents('/pathto/exec/file_replaced.exec', $replacedBinFile);

【讨论】:

  • 难道不能从我的数据库(而不是 exe)中读取所有十六进制数据,然后我创建一个字符串并将其刷新到 exe 中吗?
  • Php substr() 是二进制安全的,并且对字节而不是字符进行操作。 php 中的字符串也是字节序列。因此,如果它是一个 php 字符串,那么从哪里获取数据并不重要。它可以来自数据库、$_POST、xml 等等。我真的不明白“十六进制数据”是什么意思。你能解释更多吗?
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多