php 的 pack 函数写出图片文件遇到的问题

2016-08-23 15:05:21 +08:00
 hard2reg
$buf = file_get_contents("photo.dat");
$buf = unpack("C*", $buf);
$GLOBALS["magic"] = $buf[1] ^ 0xff;
$photo = array_map("my_xor", $buf);
// 这上面都是对的
$photo = pack("H*", $photo);
file_put_contents("photo.jpg", $photo);

结果写出的图片大小才几个字节。。。 想知道是哪里错了。。。 实在 google 不出来

2405 次点击
所在节点    PHP
21 条回复
yao978318542
2016-08-23 16:53:16 +08:00
告诉我你用的什么代理 我就告诉你怎么解决
hard2reg
2016-08-23 17:19:59 +08:00
@yao978318542 代理是指什么?
yao978318542
2016-08-23 17:21:05 +08:00
你都能 google 了 翻墙的梯子啊!
hard2reg
2016-08-23 17:26:46 +08:00
@yao978318542 用的 Shadowsocks 啊。。。你可以教我怎么解决了吧。。
yao978318542
2016-08-23 17:30:58 +08:00
我先听一下你的需求吧 看你的代码容易和你犯同样的错误
hard2reg
2016-08-23 18:23:28 +08:00
@yao978318542 就是读取 dat 文件,把里面的每个字节与指定十六进制数异或,然后将异或后的数据保存为 jpg 。
wesley
2016-08-23 18:48:01 +08:00
图片开头若干个字符是描述信息,你做异或运算不应该包含这些字符
hard2reg
2016-08-23 19:02:18 +08:00
@wesley 不是描述信息,整个图片的数据都被加密了。
hard2reg
2016-08-23 21:13:38 +08:00
这贴就这么死了?
yao978318542
2016-08-24 09:29:50 +08:00
my_xor 函数贴出来啊 加密是你加的吗?还是你要破解
des
2016-08-24 09:45:52 +08:00
为什么不用 fopen ??
你应该去看一下 pack 是怎么传参的。
还有“ my_xor ”是什么鬼?
hard2reg
2016-08-24 13:41:36 +08:00
@yao978318542 已贴出来,我要破解。
@des 已贴出来。

按理来说字节数异或后应该是不变的,但是写出文件后字节数居然变了。。。
yao978318542
2016-08-24 13:50:33 +08:00
感觉悬 看来帮不上你了
hard2reg
2016-08-24 14:16:57 +08:00
@yao978318542 /(ㄒoㄒ)/~~
des
2016-08-24 14:24:39 +08:00
@hard2reg 你是想要这样??
$photo = array_map(function($b){return pack('H',$b^$magic)}, $buf);
yao978318542
2016-08-24 14:31:05 +08:00
@hard2reg 要不你把文件发给我 我帮你试试?
hard2reg
2016-08-24 14:48:04 +08:00
@des pack 之前要先 unpack 吗
hard2reg
2016-08-24 15:05:47 +08:00
@des 嗯,现在写出文件后文件大小对了,但是。。。貌似解密失败?

$buf = file_get_contents('photo.dat');
$buf = unpack('C*', $buf);
$magic = $buf[1] ^ 0xff;
$photo = array_map(function($b){return pack('H', $b ^ $magic);}, $buf);
$b = file_put_contents('photo.jpg', $photo);

这是正确解密的 Python 代码

def _decode_pc_dat(self, datfile):
with open(datfile, 'rb') as f:
buf = bytearray(f.read())

magic = 0xff ^ list(buf)[0] if buf else 0x00
imgfile = re.sub(r'.dat$', '.jpg', datfile)
with open(imgfile, 'wb') as f:
newbuf = bytearray([b ^ magic for b in list(buf)])
f.write(newbuf)
hard2reg
2016-08-24 15:31:37 +08:00
@yao978318542 自己解决了!
@des 感谢帮助!你提供的代码很有用!
yao978318542
2016-08-25 11:34:50 +08:00
@hard2reg 能吧代码发给我一份参考一下吗?多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/301194

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX