python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别
1.python2将base64数据写成图片,并将数据转为16进制字符串的方法
import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABEAABERABEiABEzACIAACIRACIiACIzADMAADMRADMiADMzADd3REREQAAVQAAmQAA3QBVAABVVQBMmQBJ3QCZAACZTACZmQCT3QDdAADdSQDdkwDungDu7iIiIgAAZgAAqgAA7gBmAABmZgBVqgBP7gCqAACqVQCqqgCe7gDuAADuTwD/VQD/qgD//zMzMwAAdwAAuwAA/wB3AAB3dwBduwBV/wC7AAC7XQC7uwCq/wD/AEQAREQAiEQAzEREAEREREREiEREzESIAESIRESIiESIzETMAETMRETMiETMzEQAAFUAAFUAVUwAmUkA3VVVAFVVVUxMmUlJ3UyZAEyZTEyZmUmT3UndAEndSUndk0nd3U/u7mYAAGYAZlUAqk8A7mZmAGZmZlVVqk9P7lWqAFWqVVWqqk+e7k/uAE/uT0/unlX/qlX//3cAAHcAd10Au1UA/3d3AHd3d11du1VV/127AF27XV27u1Wq/1X/AFX/VYgAiIgAzIhEAIhERIhEiIhEzIiIAIiIRIiIiIiIzIjMAIjMRIjMiIjMzIgAAIgARJkATJkAmZMA3ZlMAJlMTJlMmZNJ3ZmZAJmZTJmZmZOT3ZPdAJPdSZPdk5Pd3ZkAAKoAAKoAVaoAqp4A7qpVAKpVVapVqp5P7qqqAKqqVaqqqp6e7p7uAJ7uT57unp7u7qr//7sAALsAXbsAu6oA/7tdALtdXbtdu6pV/7u7ALu7Xbu7u6qq/6r/AKr/Var/qswAzMxEAMxERMxEiMxEzMyIAMyIRMyIiMyIzMzMAMzMRMzMiMzMzMwAAMwARMwAiN0Ak90A3d1JAN1JSd1Jk91J3d2TAN2TSd2Tk92T3d3dAN3dSd3dk93d3d0AAN0ASe4AT+4Anu4A7u5PAO5PT+5Pnu5P7u6eAO6eT+6enu6e7u7uAO7uT+7unu7u7u4AAP8AAP8AVf8Aqv8A//9VAP9VVf9Vqv9V//+qAP+qVf+qqv+q////AP//Vf//qv///ywAAAAAagAeAAAI//8EDiRY0OBBhAkVLmTY0OFDiAVtTKQY0eJFjBkXUuTIUeNHkCEZdhRZ0uRJlA1tpGTZEuHKlS5luow5U6A7XrzcDfTosOPPnwvd7bTJUBOaPGiI4tQZ1CBQqFAN8lqVp6jRVbzy7HS3CmmebhiHWnRnoypRmTURZuWliesqTVrDXsxjI8+qfzhHusuTcy7Nf2oLwqXq9l83TVlX/T1IFW/BxN3u/uOFxi6vlxP9Yp4peLAmyToPg6XK+DCvlZXzWC14N/S/vt2yJky99fHVg1Vhc27rGC1qyxPhulMKeRVfzH1LL+ym1DBug6uObxWodTda4t1QI9eKVuDkmEq7M+0Huxh6dLdo5lrvS5Dv4r59zXr/F5d4XvGaGHLnfH5g4vFwOi6ughDLarWKIMvJqu50E6q0/jRKMCLplusqK9AKwgmso1C77b8FqbItQg3H6k6/jyaEyJ3E3isspww1vGu79tzrS8DYCGysLbzYoy+iijxrSC7H5IvqyImqu6sq5XTUEClN8oiSl9ck/MgrxaiM8sf/jpPMtOo0SUzK1biEbTGqcpLOTNwKgwuphdpabTEu3enmzpxIJEjOPAnz7yCmREPSBsdEA+nC1aj8MyQkxRprUUhTEjJSSgVSsVJMA/tz0kwXvbTTSDmNNCAAOw=='
data = base64.b64decode(img)
print type(data) # <type 'str'>
hex_data = binascii.b2a_hex(data)
print type(hex_data) # <type 'str'>
with open('ddd.png', 'wb') as f:
f.write(data)
2.python将base64数据写成图片的方法,并将数据转为16进制字符串的方法
import base64
img = 'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABEAABERABEiABEzACIAACIRACIiACIzADMAADMRADMiADMzADd3REREQAAVQAAmQAA3QBVAABVVQBMmQBJ3QCZAACZTACZmQCT3QDdAADdSQDdkwDungDu7iIiIgAAZgAAqgAA7gBmAABmZgBVqgBP7gCqAACqVQCqqgCe7gDuAADuTwD/VQD/qgD//zMzMwAAdwAAuwAA/wB3AAB3dwBduwBV/wC7AAC7XQC7uwCq/wD/AEQAREQAiEQAzEREAEREREREiEREzESIAESIRESIiESIzETMAETMRETMiETMzEQAAFUAAFUAVUwAmUkA3VVVAFVVVUxMmUlJ3UyZAEyZTEyZmUmT3UndAEndSUndk0nd3U/u7mYAAGYAZlUAqk8A7mZmAGZmZlVVqk9P7lWqAFWqVVWqqk+e7k/uAE/uT0/unlX/qlX//3cAAHcAd10Au1UA/3d3AHd3d11du1VV/127AF27XV27u1Wq/1X/AFX/VYgAiIgAzIhEAIhERIhEiIhEzIiIAIiIRIiIiIiIzIjMAIjMRIjMiIjMzIgAAIgARJkATJkAmZMA3ZlMAJlMTJlMmZNJ3ZmZAJmZTJmZmZOT3ZPdAJPdSZPdk5Pd3ZkAAKoAAKoAVaoAqp4A7qpVAKpVVapVqp5P7qqqAKqqVaqqqp6e7p7uAJ7uT57unp7u7qr//7sAALsAXbsAu6oA/7tdALtdXbtdu6pV/7u7ALu7Xbu7u6qq/6r/AKr/Var/qswAzMxEAMxERMxEiMxEzMyIAMyIRMyIiMyIzMzMAMzMRMzMiMzMzMwAAMwARMwAiN0Ak90A3d1JAN1JSd1Jk91J3d2TAN2TSd2Tk92T3d3dAN3dSd3dk93d3d0AAN0ASe4AT+4Anu4A7u5PAO5PT+5Pnu5P7u6eAO6eT+6enu6e7u7uAO7uT+7unu7u7u4AAP8AAP8AVf8Aqv8A//9VAP9VVf9Vqv9V//+qAP+qVf+qqv+q////AP//Vf//qv///ywAAAAAagAeAAAI//8EDiRY0OBBhAkVLmTY0OFDiAVtTKQY0eJFjBkXUuTIUeNHkCEZdhRZ0uRJlA1tpGTZEuHKlS5luow5U6A7XrzcDfTosOPPnwvd7bTJUBOaPGiI4tQZ1CBQqFAN8lqVp6jRVbzy7HS3CmmebhiHWnRnoypRmTURZuWliesqTVrDXsxjI8+qfzhHusuTcy7Nf2oLwqXq9l83TVlX/T1IFW/BxN3u/uOFxi6vlxP9Yp4peLAmyToPg6XK+DCvlZXzWC14N/S/vt2yJky99fHVg1Vhc27rGC1qyxPhulMKeRVfzH1LL+ym1DBug6uObxWodTda4t1QI9eKVuDkmEq7M+0Huxh6dLdo5lrvS5Dv4r59zXr/F5d4XvGaGHLnfH5g4vFwOi6ughDLarWKIMvJqu50E6q0/jRKMCLplusqK9AKwgmso1C77b8FqbItQg3H6k6/jyaEyJ3E3isspww1vGu79tzrS8DYCGysLbzYoy+iijxrSC7H5IvqyImqu6sq5XTUEClN8oiSl9ck/MgrxaiM8sf/jpPMtOo0SUzK1biEbTGqcpLOTNwKgwuphdpabTEu3enmzpxIJEjOPAnz7yCmREPSBsdEA+nC1aj8MyQkxRprUUhTEjJSSgVSsVJMA/tz0kwXvbTTSDmNNCAAOw=='
data = base64.b64decode(img) print(type(data)) # <class 'bytes'>
hex_imgdata = ''.join(["%02X" % x for x in data]).strip()
print(type(hex_imgdata)) # <class 'str'> with open('ddd.png', 'wb') as f:
f.write(data)
3.python 字符串与16进制互转
1 ByteToHex的转换
def ByteToHex( bins ):
return ''.join( [ "%02X" % x for x in bins ] ).strip()
返回数据16进制字符串 '91f8148cfbd5faa3d98b' 2.bytes类型转为16进制bytes类型
import binascii
sign 为bytes类型字符串 如 b'\x91\xf8\x14\x8c\xfb\xd5|'
print(type(sign)) >> <class 'bytes'>
ret = binascii.b2a_hex(sign) ret为16进制bytes
print(ret) 》》 如 b'91f8148cfbd5faa3d98b' 3 HexToByte的转换
def HexToByte( hexStr ):
return bytes.fromhex(hexStr) >>> binascii.b2a_hex(u"你好啊".encode("utf8"))
'e4bda0e5a5bde5958a'
>>> >>> binascii.b2a_hex(u"你好啊".encode("gbk"))
'c4e3bac3b0a1'
>>> binascii.a2b_hex("e4bda0e5a5bde5958a")
'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
>>> binascii.a2b_hex("e4bda0e5a5bde5958a").decode("utf8")
u'\u4f60\u597d\u554a'
>>> print binascii.a2b_hex("e4bda0e5a5bde5958a").decode("utf8")
你好啊
>>> binascii.b2a_hex(u"你好啊121A号".encode("gbk"))
'c4e3bac3b0a131323141bac5'
>>> '48656c6c6f'.decode('hex')
'Hello'
>>> 'c4e3bac3b0a131323141bac5'.decode('hex')
'\xc4\xe3\xba\xc3\xb0\xa1121A\xba\xc5'
>>> print 'c4e3bac3b0a131323141bac5'.decode('hex')
你好啊121A号
>>> u"你好啊121A号".encode("gbk").encode('hex')
'c4e3bac3b0a131323141bac5'
>>>
3.Python 3中bytes/string的区别
python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分。文本总是用unicode进行编码,以str类型表示;而二进制数据以bytes类型表示。
在python3中,不能以任何隐式方式将str和bytes类型二者混合使用。不可以将str和bytes类型进行拼接,不能在str中搜索bytes数据(反之亦然),也不能将str作为参数传入需要bytes类型参数的函数(反之亦然)。
字符串和字节符之间划分界线是必然的。下面这个图解要牢记于心:

strings可以被编码(encode)成字bytes,bytes也可以解码(decode)成strings:
|
1
2
3
4
|
>>> '€20'.encode('utf-8')b'\xe2\x82\xac20'>>> b'\xe2\x82\xac20'.decode('utf-8')'€20' |
可以这样理解:
string是文本(text)的抽象表示。字符串(string)由字符组成,字符也是抽象的实体且与任何二进制表示无关。
当操纵字符串的时候,很多细节是不用了解的。我们可以分割、切片和拼接字符串,在字符串内部进行搜索。但并不在乎内部是如何表示的,也不用在意底层一个字符要花费多少byte。
只有在需要将string编码(encode)成byte的时候,比如:通过网络传输数据;或者需要将byte解码(decode)成string的时候,我们才会关注string和byte的区别。
传入encode和decode的参数是编码方式。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:
|
1
2
3
4
|
>>> '€20'.encode('iso-8859-15')b'\xa420'>>> b'\xa420'.decode('iso-8859-15')'€20' |
编码是这个转换过程中至关重要的一部分。若不编码,bytes对象b'\xa420'只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:
|
1
2
|
>>> b'\xa420'.decode('windows-1255')'₪20' |
4.python2和python3中str,bytes区别
python2中,有basestring、str、bytes、unicode四种类型
其中str == bytes , basestring = (str,unicode)
>>> isinstance('s',str)
True
>>> isinstance('s',bytes)
True
>>> isinstance('s',unicode)
False
>>> isinstance('s'.decode(),unicode)
True
>>> isinstance('s'.decode(),basestring)
True
>>> isinstance('s',basestring)
True
python3中,有str和bytes类型
>>> isinstance('s',str)
True
>>> isinstance('s',bytes)
False
>>> isinstance('s',unicode)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'unicode' is not defined
>>> isinstance(b's',bytes)
True
>>> isinstance('s',basestring)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'basestring' is not defined
参考:
https://www.cnblogs.com/abclife/p/7445222.html
https://blog.csdn.net/weixin_37989267/article/details/79432242
https://www.cnblogs.com/leomei91/p/7681416.html
python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别的更多相关文章
- android 蓝牙编程重点---如何发送和接收16进制数据
最近的android蓝牙开发项目也逐渐接近尾声,基本的功能都已经完成,只剩下界面的设计.现在真的是舒了一口气! 作为编程学习经验只有1年的菜鸟,这是我独自完成的商业性产品,而且还是涉及到与单片机蓝牙模 ...
- PHP 通过Socket收发16进制数据
最近在php下做关于Socket通讯的相关内容,发现网络上好多人在了解如何进行16进制收发,研究了下,代码如下,欢迎拍砖. <?php $sendStr = '30 32 30 3 ...
- Java中char转为16进制
Java中char转为16进制 char a = '0'; String hexStr = Integer.toHexString(a); System.out.println(hexStr);
- Java中字符串转为16进制表示
Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...
- JS吧数字转成2进制 8进制16进制数据
; number.toString(); //转成2进制 number.toString();//转成8进制 number.toString();//转成10进制 number.toString(); ...
- 二进制;16进制; Byte , Python的bytes类; Base64数据编码; Bae64模块;
参考:中文维基 二进制 位操作(wiki) Byte字节 互联网数据处理:Base64数据编码 Python的模块Base64 16进制简介 python: bytes对象 字符集介绍:ascii 二 ...
- 接口返回buffer的16进制数据如何转换
我们请求接口数据经常会看到buffer数据,这是我们可以使用data.toString()就可以啦~
- c# serialport读取不限数量的16进制数据
//private char[] HexChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', ' ...
- Flex接收51单片机发送过来的16进制数据转换为String
private static function toHex(bytes:ByteArray):String{ var pos:int =bytes.position; bytes.position=0 ...
随机推荐
- (原)ubuntu中安装kate
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6339642.html 参考网址: https://kate-editor.org/build-it/# ...
- Mybaits 使用多数据库源错误 --MapperScannerConfigurer配置
我在配置文件里面配置了一个数据源,数据源参数是根据配置文件加载.数据源在mybaits和自定义数据工具类中使用,但是启动工程后,报错如下: ### Cause: org.springframewor ...
- linux nginx配置新项目加域名(设置绑定域名)
转自:linux nginx配置新项目加域名 找到nginx的配置文件 nginx/nginx.conf 第一种方,法直接在nginx.com里面配置 user www www; worker_pro ...
- html锚点定位不准确问题
问题描述 当顶部固定时,点击锚点,会跳转到锚点以下. <style> #one,#two,#three{ height: 500px; } #top{ position: fixed; h ...
- jquery添加未来元素时,其绑定事件不起作用解决办法
delegate说起对未来元素是其作用的,于是写下代码: <!DOCTYPE HTML> <html> <head> <meta charset=" ...
- 进阶之路(基础篇) - 010 Arduino 函数(基本、串口、SPI)
一.基本函数 pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认低电平(或浮空) digitalRead(数字输入端口号); analogRe ...
- FormsAuthentication.SetAuthCookie
这两天在研究 Forms 进行用户验证, 它本身没有什么上msdn上查一下就知道怎么个搞法了! 不过我在测试的时候发现也会产生 了一些疑问! 1. 什么我在web.config 的 authentic ...
- Linux安装最新版Mono,Jexus(截至2015年12月30日)
安装系统必备: yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel libjpeg-dev ...
- iOS扩大UIButton按钮的可点击区域
一.开发中遇到的问题 我们在开发时有时遇到这中情况:UI给的图片很小,button的点击区域要求比较大.如果用 setBackgroundImage: 方式设置图片会导致图片也跟着button的fra ...
- 为什么说,长跑和爬山能锻炼意志?因为要不停的run,run,run......
长跑和爬山教会我们的是无论做什么都要坚持,教会我们的是生活的态度. 如果不能体会到这一点,那你长跑的意义就是纯粹的锻炼身体. 中国教育的最大败笔就是教会了人学习,却没教会人思考.