V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hard2reg
V2EX  ›  PHP

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

  •  
  •   hard2reg · 2016-08-23 15:05:21 +08:00 · 2474 次点击
    这是一个创建于 3014 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $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 不出来

    第 1 条附言  ·  2016-08-24 13:40:20 +08:00

    不好意思,Callback函数忘记贴上来了。。

    function my_xor($b)
    {
    	return $b ^ $magic;
    }
    
    第 2 条附言  ·  2016-08-24 15:31:59 +08:00
    结帖!感谢各位的帮助!
    21 条回复    2016-08-25 14:16:19 +08:00
    yao978318542
        1
    yao978318542  
       2016-08-23 16:53:16 +08:00
    告诉我你用的什么代理 我就告诉你怎么解决
    hard2reg
        2
    hard2reg  
    OP
       2016-08-23 17:19:59 +08:00
    @yao978318542 代理是指什么?
    yao978318542
        3
    yao978318542  
       2016-08-23 17:21:05 +08:00
    你都能 google 了 翻墙的梯子啊!
    hard2reg
        4
    hard2reg  
    OP
       2016-08-23 17:26:46 +08:00
    @yao978318542 用的 Shadowsocks 啊。。。你可以教我怎么解决了吧。。
    yao978318542
        5
    yao978318542  
       2016-08-23 17:30:58 +08:00
    我先听一下你的需求吧 看你的代码容易和你犯同样的错误
    hard2reg
        6
    hard2reg  
    OP
       2016-08-23 18:23:28 +08:00
    @yao978318542 就是读取 dat 文件,把里面的每个字节与指定十六进制数异或,然后将异或后的数据保存为 jpg 。
    wesley
        7
    wesley  
       2016-08-23 18:48:01 +08:00
    图片开头若干个字符是描述信息,你做异或运算不应该包含这些字符
    hard2reg
        8
    hard2reg  
    OP
       2016-08-23 19:02:18 +08:00
    @wesley 不是描述信息,整个图片的数据都被加密了。
    hard2reg
        9
    hard2reg  
    OP
       2016-08-23 21:13:38 +08:00
    这贴就这么死了?
    yao978318542
        10
    yao978318542  
       2016-08-24 09:29:50 +08:00
    my_xor 函数贴出来啊 加密是你加的吗?还是你要破解
    des
        11
    des  
       2016-08-24 09:45:52 +08:00 via Android
    为什么不用 fopen ??
    你应该去看一下 pack 是怎么传参的。
    还有“ my_xor ”是什么鬼?
    hard2reg
        12
    hard2reg  
    OP
       2016-08-24 13:41:36 +08:00
    @yao978318542 已贴出来,我要破解。
    @des 已贴出来。

    按理来说字节数异或后应该是不变的,但是写出文件后字节数居然变了。。。
    yao978318542
        13
    yao978318542  
       2016-08-24 13:50:33 +08:00
    感觉悬 看来帮不上你了
    hard2reg
        14
    hard2reg  
    OP
       2016-08-24 14:16:57 +08:00
    @yao978318542 /(ㄒoㄒ)/~~
    des
        15
    des  
       2016-08-24 14:24:39 +08:00
    @hard2reg 你是想要这样??
    $photo = array_map(function($b){return pack('H',$b^$magic)}, $buf);
    yao978318542
        16
    yao978318542  
       2016-08-24 14:31:05 +08:00
    @hard2reg 要不你把文件发给我 我帮你试试?
    hard2reg
        17
    hard2reg  
    OP
       2016-08-24 14:48:04 +08:00
    @des pack 之前要先 unpack 吗
    hard2reg
        18
    hard2reg  
    OP
       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
        19
    hard2reg  
    OP
       2016-08-24 15:31:37 +08:00
    @yao978318542 自己解决了!
    @des 感谢帮助!你提供的代码很有用!
    yao978318542
        20
    yao978318542  
       2016-08-25 11:34:50 +08:00
    @hard2reg 能吧代码发给我一份参考一下吗?多谢
    hard2reg
        21
    hard2reg  
    OP
       2016-08-25 14:16:19 +08:00
    @yao978318542

    $buf = unpack('C*', $buf);
    $magic = $buf[1] ^ 0xff;
    $photo = array_map(function($b){return pack('C', $b ^ $GLOBALS['magic']);}, $buf);
    $file_name = md5(microtime()) . '.jpg';
    $b = file_put_contents($file_name, $photo);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:55 · PVG 05:55 · LAX 13:55 · JFK 16:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.