做开发第一个接触的编码方式就是Base64,当时是用url来传输一些参数,传输的两端会用Base64来编码和解码,保证数据不被url转义破坏。

下面是 维基百科 Base64 中的介绍,其实自己实现起来也不是很麻烦。

Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Shell中使用

一般Linux系统中都会有个base64的命令,openssl命令也有base64的选项。

base64 命令

字符串操作,更多参考 man base64

# echo "you are so cool"|base64
eW91IGFyZSBzbyBjb29sCg==

# echo "eW91IGFyZSBzbyBjb29sCg=="|base64 -d
you are so cool

#中文

# echo "你真帅"|base64
5L2g55yf5biFCg==

# echo "5L2g55yf5biFCg=="|base64 -d
你真帅

openssl命令

$ openssl enc -base64 <<< "good boy"
Z29vZCBib3kK

$ openssl enc -base64 -d <<< "Z29vZCBib3kK"
good boy

Python 使用base64

标准库中提供了base16,base32, base64 好几个接口,最常用的是 base64.b64encodebase64.b64decode ,还有针对于url的改进方式 base64.urlsafe_b64encodebase64.urlsafe_b64decode, 这一对方法和标准的base64不同的是针对url改善了64个字符中最后2个,具体的看这里的说明, 结合wiki中的 base64索引表 就明白了。

编码 和 解码

$ python -c "import base64; print base64.b64encode('you are so cool')"
eW91IGFyZSBzbyBjb29s

$ python -c "import base64; print base64.b64decode('eW91IGFyZSBzbyBjb29s')"
you are so cool

注意无法对unicode直接base64编码, 所以请注意字符编码问题。

# python -c "import base64; print base64.b64encode('酷')"
6YW3

# python -c "import base64; print base64.b64encode(u'酷')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/base64.py", line 53, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

常用代码片段

经常使用的方式是对编码之后字符串结尾的 =做剔除 。对于 urlsafe_b64encodeb64encode 都适用,针对不同编程语言相互转化的情况请具体参照语言的实现方式。

import base64

def base64encode(raw):
    return base64.urlsafe_b64encode(raw).strip("=")

def base64decode(data):
    return base64.urlsafe_b64decode(data + "=" * (-len(data)%4))

阅读

Python和shell中Base64编码使用那些事的更多相关文章

  1. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  2. Python 读取文件中unicode编码转成中文显示问题

    Python读取文件中的字符串已经是unicode编码,如:\u53eb\u6211,需要转换成中文时有两种方式 1.使用eval: eval("u"+"\'" ...

  3. Python 中 base64 编码与解码

    base64 是经常使用的一种加密方式,在 Python 中有专门的库支持. 本文主要介绍在 Python2 和 Python3 中的使用区别: 在 Python2 环境: Python 2.7.16 ...

  4. python中base64编码与解码

    在python3中用base64进行编码和解码的时候特别注意: 题目要求: 准备一张.jpg图片,比如:mm.jpg,读取图片数据并通过b85encode加密之后写入到新文件mm.txt文件中,然后读 ...

  5. python在shell中环境变量使用

    1.用Python Shell设置或获取环境变量的方法: 设置系统环境变量 os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型 os.putenv( ...

  6. 【python】网页中字符编码转换 unicode-escape

    有的时候我们用python来抓取网页会得到类似 '\\u003C\\u0066\\u0072\\u006F\\u006D\\u003E' 或者 '%u003c%u0062%u0072%u003e%u0 ...

  7. python[练习题]:实现Base64编码

    要求自己实现算法,不用库. Base64简介: Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多 ...

  8. linux shell 中文件编码查看及转换方法

    参考: http://edyfox.codecarver.org/html/vim_fileencodings_detection.html 一.查看文件编码.     在打开文件的时候输入:set ...

  9. python将图片转为base64编码

    import base64 f = open("m1.jpg", "rb") res = f.read() s = base64.b64encode(res) ...

随机推荐

  1. pandas小记:pandas时间序列分析和处理Timeseries

    http://blog.csdn.net/pipisorry/article/details/52209377 其它时间序列处理相关的包 [P4J 0.6: Periodic light curve ...

  2. android:shape属性详解

    这一类的shape定义在xml中 file location: res/drawable/filename.xml The filename is used as the resource ID.(这 ...

  3. GC真正的垃圾:强、软、弱、和虚 对象

    垃圾回收的基本思想就是判断一个对象是否可触及性,说白了就是判断一个对象是否可以访问,如果对象对引用了,说明对象正在被使用,如果发现对象没有被引用,说明对象已经不再使用了,不再使用的对象可以被回收,但是 ...

  4. Java虚拟机定义

    虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的 ...

  5. 最简单的基于DirectShow的示例:视频播放器自定义版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  6. Android的SeekBar和RateBar的使用-android学习之旅(三十二)

    SeekBar简介 SeekBar允许用户拖动,进行调节经常用于音量调节等方面. android:thumb设置drawable对象来表示拖动的物体. setOnSeekBarChangeListen ...

  7. (七十八)使用第三方框架INTULocationManager实现定位

    前面(第七十五.七十六篇)讲述了如何通过CoreLocation获取位置,授权.获取等相当复杂,如果借助于第三方框架,可以简单的实现授权与定位. 首先在GitHub中搜索LocationManager ...

  8. 【项目管理】 PMBOK 基础概念 (引论 PMBOK 笔记)

    好紧张, 3月28考试, 全力学 PMP ~~ 一. 项目 1. 项目的定义 项目 : 项目是为创造 独特 的 产品, 服务 或 成果 而进行的 临时性 工作; -- 独特 : 独特性是项目的特征, ...

  9. Eclipse 快捷方式 指定 固定 workspace

    右点击Eclipse快捷键,然后点击属性, 把目标(target)内容修改如下: clipse -data c:\myworkspace -vm c:\ j2sdk1.5\jre\bin\javaw ...

  10. java 判断是否是周末

    package untitled7; import java.util.Date; import java.text.SimpleDateFormat; import java.util.Calend ...