c++ string转double_bytes、string、编码、python

21caa63a43cc00e80dd92604a1a1c206.png

最近经常遇到这个东西,记录一下。

主要平台python3

bytes是字节流,是二进制的数据,每一“位”占八个bit,也就是一个byte。这也是bytes这个名字的来源。这些byte也许可以直接显示,也许不行。对计算机来说,bytes是唯一真实存在于内存中的的东西。计算机所做的一切,就是为了解释这些二进制。他们也许是可执行程序,也许是图片,也许是音乐,也许是中文字符。

string是一个对象,是你能看见的字符串。python中的字符串默认utf-8编码。

string转换成bytes需要指定编码,比方说“风回雪舞”就没法对应成某个byte,必须要按照某种规则映射成byte才行。这里的“规则”就是utf-8,gbk之类的东西。ascii只能处理英文字符,处理不了英文,所以我们企图用ascii给中文编码时,就会遇到问题。

>>> bytes("风回雪舞","utf-8")
b'xe9xa3x8exe5x9bx9exe9x9bxaaxe8x88x9e'

>>> bytes("风回雪舞","gbk")
b'xb7xe7xbbxd8xd1xa9xcexe8'

>>> bytes("风回雪舞","utf-16")
b'xffxfexcex98xdeVxeax96x1ex82'

>>> bytes("风回雪舞","ascii")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

反过来,bytes转换成string也需要按照某种规则解码

>>> b'xe9xa3x8exe5x9bx9exe9x9bxaaxe8x88x9e'.decode("utf-8")
'风回雪舞'

如果你不转换,非要直接显示呢?那就会像上图一样,输出这些奇奇怪怪的东西.但其实这也是有规律可循的。在python中,如果你硬要显示这些不在ascii集中的byte,他就会以x加一个十六进制数字的形式显示.这也是一种编码,因为他完成了256种byte到可显示字串的一一对应.给定任何一个bytes,我都能把他转换成这个形式(可能不唯一),还能转换回来。

为什么说不唯一呢?

>>> b'x44'
b'D'
>>> (b'x44' == b'D')
True
>>> len(b'x44')
1

因为一个数字0x44,也就是十进制的68 ,在ascii中就是对应字母D。

应该说python还是很友好的,至少能告诉你这个byte具体是啥,要是换成windows,CC++,就指不定给你显示什么牛鬼蛇神了

658e8c20c670e3d80fe328aa774b6d4a.png

说起来,著名的“烫烫烫”“屯屯屯”就是因为debug模式下的VS会把栈填充成0xcc,而0xcc在GBK下就是烫。栈里面则填充成0xcd,gbk下就是屯

>>> b"xccxccxccxccxccxcc".decode("gbk")
'烫烫烫'
>>> b"xcdxcdxcdxcdxcdxcd".decode("gbk")
'屯屯屯'

但python3也会干一些奇怪的事情,比如说

>>> str(b"123")
"b'123'"

在不指定编码的情况下,str会吧b'123'转换成一个长度为5的str:“b‘123’”

同时b‘123’仍然是一个长度为3的bytes,就算赋给变量aa也无济于事

>>> type(b'123')
<class 'bytes'>
>>> len(b'123')
3
>>> aa=b'123'
>>> type(aa)
<class 'bytes'>
>>> len(aa)
3
>>> str(aa)
"b'123'"

但我们乖乖地指定编码,就没这么多问题了

>>> str(aa,"utf-8")
'123'
>>> str(b'123',"utf-8")
'123'

总结一下,bytes转string,一定要指定编码,不然就会在首尾多出来这些奇怪的东西。

#todo: base64 数字 bytes str

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值