加密解密 - 如何用python把任意文件转换为“1010”样子的文本
天蓬老师
天蓬老师 2017-04-17 11:21:59
[Python讨论组]

最近迷上了玩python challenge,就想写个能实现如题功能的玩意,无奈脑袋不够用。。。

另,希望能够以一个图片为例,再将字符串转回原来原来的图片。多谢!

(另,最好是python,不过java\c\c++都可以)

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
迷茫

感谢 @xavierskip 的评论!

终于摸出来了。。收获良多。

用二进制形式打开文件后,read()出来的字符串叫做binary string,二进制字符串,指的是这串字符串二进制层面上和文件完全相同,把它写入到另一个二进制文件中就等于拷贝了一份。而不是指表现形式上的二进制(101010101)。

然后就是把这个字符串里的每个字符用ord()转换数字,再转成二进制表现形式的字符串就可以了。要注意的是python的bin()函数不会自己补足8位。

好奇一下。。。binary string(二进制字符串)是指和它代表的文件在二进制层面上内容相同的字符串,那1010这种字符串又怎么称呼呢?
stackoverflow上很多问题似乎都是用1s and 0s来表示。。。有没有再文艺清新点的表达方式?。。

巩固学习,写了相互转换的函数:

# path参数:要转换的文件的路径
def convertFileToOneAndZero(path):
    f = open(path,'rb')
    src = f.read()
    print len(src)

    result = []
    for i in src:
        temp = bin(ord(i))[2:]
        temp = '0' * (8-len(temp)) + temp
        result.append(temp)

    return ''.join(result)

# src参数:1010字符串
# path参数:输出文件的路径
def convertOneAndZeroToFile(src, path):
    result = []
    for i in range(0, len(src), 8):
        result.append(chr(int(src[i:i+8], 2)))

    f = open(path, 'wb')
    f.write(''.join(result))
    f.close()
天蓬老师
    result = []
    for i in src:
        temp = bin(ord(i))[2:]
        temp = '0' * (8-len(temp)) + temp
        result.append(temp)

    return ''.join(result)

这段可以一行搞定:

return ''.join([ '{0:08b}'.format(ord(i)) for i in src ])

string.format的例子可以看看 http://docs.python.org/2/library/stri...
字符串拼接的小技巧可以看 http://wiki.python.org/moin/PythonSpe...,这篇文档里面还有不少其它优化技巧

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号