gpt4 book ai didi

php - 字节位置 : file_get_contents vs fopen

转载 作者:可可西里 更新时间:2023-11-01 13:59:35 28 4
gpt4 key购买 nike

我需要二进制文件中特定字节范围内的一些数据。
(连接的 jpeg,不要问...)

所以我有一个来自外部 API 的 offsetlength 数据。
(我猜那些是字节位置)

以下是有效的:

$fileData = file_get_contents($binaryFile);
$imageData = substr($fileData, $offset, $length);

但我宁愿不将整个文件加载到内存中,因此尝试了fopen:

$handle = fopen($binaryFile, 'rb');
fseek($handle, $offset);
$imageData = fgets($handle, $length);

但这行不通。数据 block 不是有效的图像数据。
所以我假设我用 fopen 的位置错了。

关于 substrfopen 的位置有何不同有什么想法吗?

最佳答案

你写的

The data chunk is no valid image data

“图像数据”- 但在您的代码中,您调用 fgets() 来读取该数据。这是错误的,因为图像是二进制数据,而不是文本文件,所以您不希望它按行读取 ( docs ):

fgets — Gets line from file pointer

这意味着 fgets() 一旦找到它认为的行结束标记就会停止从文件中读取,这通常意味着更早停止并读取少于 $length 因为有这样的字节不在二进制序列中的可能性很小。

所以 fgets() 方法使用错误,这是主要问题。相反,你应该选择不太聪明的 fread()(它不知道行和东西,只读你说的)。最后,您应该在完成后 fclose() 句柄。当然,您应该始终检查错误,从 fopen() 开始:

if ($handle = fopen($binaryFile, 'rb')) {
if (fseek($handle, $offset) === 0) {
$imageData = fread($handle, $length);
if ($imageData === false) {
// error handling - failed to read the data
}
} else {
// error handling - seek failed
}
fclose($handle);
} else {
// error handling - can't open file
}

所以始终使用正确的工具来完成任务,如果您不确定给定的方法/函数的作用,总是有 not-that-bad documentation偷看。

关于php - 字节位置 : file_get_contents vs fopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com