我打开了一个文件(二进制)的,然后利用bin2hex函数,将其变成了十六进制的字符串,并且修改了其中一个特定位置的数值,现在问题是,我想保存回去,发现变成了ASCII文件,请问各位,如何应该保存成和源文件格式一样的代码呢?

下面是代码:

$fp=fopen("sample.bin",'rb');

$word='';

while(!feof($fp)){

$buf = bin2hex(fread($fp,48));

$pos = strpos($buf, '02000100'); // 查找土地

//if $pos == 0 {

// echo "这是土地";

//}

echo $buf;

echo "\n-------------\n";

echo ($pos/2);

echo $buf2=str_replace("02000100","BE010000",$buf);

$word=$word.$buf2;

echo "\n";

}

fclose($fp);

echo $word;

$new= fopen('new.bin','w');

fwrite($new,$word);

fclose($new);

?>

回复讨论(解决方案)

一个文件一种格式,存两种格式也没有意义,可以在需要时候再取出来转换,不用转为十六进制

1、既然你用 $fp=fopen("sample.bin",' rb'); 打开文件,表示你的程序可在 window 系统下工作,那么写入时也应 $new= fopen('new.bin','w b');

b 表示二进制方式,window 下必须严格区别,linux 下无所谓

2、处理后的 $word 的内容是十六进制表示,你在写入文件时并没有再转回二进制

可用 $word = pack('H*', $word); 转换

$word = '';

$from = pack('H*', '02000100');

$target = pack('H*', 'BE010000');

while(!feof($fp)){

$buf = bin2hex(fread($fp,48));

$buf2 = str_replace($from, $target, $buf);

$word .= $buf2;

}

这样 $word 中依旧是二进制数据

$word = '';

$from = pack('H*', '02000100');

$target = pack('H*', 'BE010000');

while(!feof($fp)){

$buf = bin2hex(fread($fp,48));

$buf2 = str_replace($from, $target, $buf);

$word .= $buf2;

……

谢谢xuzuning的意见,我按照你的修改了代码,如下:

$fp=fopen("old.bin",'rb');

$word='';

$from = pack('H*', '02000100');

$target = pack('H*', 'BE010000');

while(!feof($fp)){

$buf = bin2hex(fread($fp,48));

$buf2 = str_replace($from, $target, $buf);

$pos = strpos($buf, '02000100'); // 查找土地

//if $pos == 0 {

// echo "这是土地";

//}

echo $buf;

echo "\n-------------\n";

echo ($pos/2);

echo $buf2;

//echo $buf2=str_replace("02000100","BE010000",$buf);

$word=$word.$buf2;

echo "\n";

}

fclose($fp);

//echo $word;

$new= fopen('new.bin','wb');

fwrite($new,$word);

fclose($new);

?>

但是生成的new.bin的大小依然是old.bin的两倍,和之前没有什么区别,我的测试环境是在我的WIN2008的服务器上,IIS7+PHP,您还有什么建议么?

对不起,我 #3 的代码错了,应该是这样

$word = '';

$from = pack('H*', '02000100');

$target = pack('H*', 'BE010000');

while(!feof($fp)){

$buf = fread($fp,48);

$buf2 = str_replace($from, $target, $buf);

$word .= $buf2;

}

完全按二进制方式操作

对不起,我 #3 的代码错了,应该是这样

$word = '';

$from = pack('H*', '02000100');

$target = pack('H*', 'BE010000');

while(!feof($fp)){

$buf = fread($fp,48);

$buf2 = str_replace($from, $target, $buf);

$wo……

感谢,问题解决!

唠叨说了关键了, windows的确区分文本和二进制文件, 因为文本的末尾是以某个特殊字节标示的.

WINDOWS下,不太了解的同学经常用fgetc函数以文本打开二进制文件, 试图一个字节一个字节的读取, 结果发现只能读了一半就开始返回EOF了, 其实是因为恰好某个字节是文本里的作为结束符的特殊字节。

但Linux一律以系统API : read返回0作为文件末,所以b参数是被忽略的。

楼主的作法多余了, 不就是想找到 土地 两个字, 然后替换一下吗 ?

不知道楼主所说的二进制文件是怎么生成的, 其实一切都是二进制, 只是在windows下b打开和非b打开得到的结果会有区别, 非b打开和用文本编辑器编辑结果是一致的.

假设你原本的文件就是一个utf8文本文件,里面有“土地”两个字,作法很简单,UTF8多字节编码的,循环fread并不一定正好能将完整的“土地”两个字的字节读到一个buffer里,所以比较好的办法是file_get_contents,之后直接str_replace("土地", “兄弟”)即, 在C语言里其实就是内存映射后替换字符串.

转什么十六进制, 纯属多此一举, 而且循环读是一定有bug的, 可能"土地"两个字是被拆开读进来的.

就连vim这种软件都是内存映射的, 文件太大它也没办法, 只能告诉你失败.

请问怎么可以调用保存窗口保存么

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 二进制 保存文件,PHP打开一个二进制文件,修改了内容如何再保存回去呢?...相关推荐

  1. 命令行修改文件文件夹访问权限 cacls, 修改hosts内容方法

    背景 日常使用Windows的过程中,hosts(C:\Windows\System32\drivers\etc)文件可能被一些程序串改,因此在网上找到禁止/允许修改hosts文件的bat脚本,但是在 ...

  2. uniapp 下载文件/二进制流数据文件 ,保存文件 ,打开文件。以及H5下载二进制流文件。

    前提注意点 downloadFile 发送的是GET请求. 如果url接口返回的是二进制流数据.则要求后端content-type 里面填写具体的返回文件类型.否则下在的文件会没有后缀名.比如exce ...

  3. word vba遍历文件,打开另外word修改保存

    处理完数个word,回头一看,才发现前面代码把一个符号搞反了... 把大于等于与小于等于两符号,颠倒了位置...晕. 马上用vba处理一下. 把这些word放在D盘根目录.逐个遍历并打开,逐一修改保存 ...

  4. WIndows10 .exe文件默认打开方式被修改后,所有exe文件全部无效的解决方法

    参考博客:https://blog.csdn.net/qq_33164724/article/details/118394288 解决方法 在桌面上新建两个文本文档,随便命名. 把这段话复制到第一个t ...

  5. .exe文件默认打开方式被修改后,所有exe文件全部无效的解决方法

    (注:系统版本为Win10 2004版本,其他版本也可以尝试一下) 记录一下今天所遇到的一个问题 今天下午不小心修改了.exe程序的默认打开方式,于是出现了如下所示的结果.点所有的exe程序都没有用( ...

  6. python sendkeys用法_使用python中的sendkeys上载文件将打开一个文件选择器弹出窗口...

    需要自动化的组件是antd-upload.在https://ant.design/components/upload/ --> Can be found here 上载按钮可见,但输入的&quo ...

  7. linux打包启动这着的文件,linux – 打开一个RPM文件并重新打包它

    修改您没有源的RPM的最佳方式是按照以下步骤操作: >使用rpm2cpio命令将rpm解压缩到目录中 >在该子目录内进行必要的更改 制作一个"虚拟"规范文件并构建它. ...

  8. java文件 默认打开方式_修改文件的默认打开方式(亲测有效)

    今天遇到了一个问题,那就是没办法修改文件的默认打开方式,Windos10系统. 可能我稍微有点强迫症什么的,每次默认记事本打开,虽然也可也选择其他的应用打开,但就是没有直接双击打开的爽. 一百度才发现 ...

  9. php header保存文件,php利用header函数实现文件下载时直接提示保存

    复制代码 代码如下: 下面是网上常用的方法 复制代码 代码如下: if (isset($link)) { Header("HTTP/1.1 303 See Other"); Hea ...

  10. 文件夹打开方式被修改后的处理办法【转载】

    发现文件夹的打开方式变为了vs2020,每次双击文件夹后直接就跳转到vs. 此时右键发现vs打开还排在第一位. 怎么恢复原来打开方式呢? 只要打开注册表编辑器,到目录"HKEY_CLASSE ...

最新文章

  1. Java项目:潜艇大战项目(java+swing)
  2. Linux多线程实践(一)线程基本概念和理论
  3. CentOS 7.0下使用yum安装MySQL
  4. mdx格式的词典用什么软件打开_视频大神都用什么软件转换视频的格式?
  5. Excel 2007中创建或删除自定义数字格式
  6. java 多线程并发 问题_JAVA多线程和并发基础面试问答
  7. 浙江省职业技能考试大纲计算机,浙江省高校计算机等级考试大纲
  8. 道客巴巴vip账号共享2020_腾讯视频VIP怎么两个手机通用?
  9. maf中anglearc_Oracle MAF中的LOV
  10. project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...
  11. LeetCode 1570. 两个稀疏向量的点积(哈希)
  12. Mybatis/Ibatis,数据库操作的返回值
  13. python爬虫之json数据处理
  14. webpack4升级指南
  15. matlab生成不重复的随机数_怎么生成不重复随机数——《超级处理器》应用
  16. JPA的继承 OOD和关系数据库的 纽带
  17. html脚本src,HTML script脚本标签
  18. Linux中:chmod命令详细解释
  19. 移远EC20 4G模块Linux驱动移植和测试
  20. 计算机辅助求解如何做,计算机辅助求解一元高次方程.pdf

热门文章

  1. FFmpeg学习(8)—— 视频去水印
  2. 深度学习笔记_各种神经网络结构对比(ImageNet竞赛中:AlexNet/VGG/GoogleNet/ResNet/SENet)
  3. 机器学习课程笔记【十四】- 增强学习和自适应控制控制论
  4. 机器学习笔记【二】逻辑回归与分类(2):感知机学习算法与逻辑回归的区别,牛顿方法
  5. 深度强化学习笔记(一)——深度强化学习简述
  6. ACM ICMR 2021雷达目标检测挑战赛(ROD2021)
  7. 【js】querySelectorAll和getElemensByTagName的区别
  8. flask前端优化:css/js/html压缩
  9. 【tool】构造朴实的测试用例
  10. 何凯明 Single Image Haze Removal Using Dark Channel Prior