最近把一段py2的代码转换到py3的代码,结果运行到向socket中写数据的代码部分出现了'str' does not support the buffer interface这样一个错误.

一番搜索之后,发现py3里是严格区分了str和bytes的.怎么理解str和bytes呢?你可以认为str是一段文本,比如“abcd#%$^*&”什么的,而bytes呢,是二进制的一堆0,1的比特而已.看下面的图:

可以看到str的类型是class 'str',而str.encode()以后类型是class 'bytes',这二者是不同的.而str.encode(‘gbk’)和str.encode('utf-8')得到的bytes的表示也是不同的.也就是说在采用不同的编码时,对同样的文本“哈哈”而言,其在内存中的那一堆01是不一样的.

str和bytes之间可以通过encode(),decode()相互转化.

下面是Python34\Lib\socket.py中的一段代码,可以看到在py3中,向一个socket file中写数据必须写的是bytes或是bytearray类型的

    def write(self, b):
"""Write the given bytes or bytearray object *b* to the socket
and return the number of bytes written. This can be less than
len(b) if not all data could be written. If the socket is
non-blocking and no bytes could be written None is returned.
"""
self._checkClosed()
self._checkWritable()
try:
return self._sock.send(b)
except error as e:
# XXX what about EINTR?
if e.args[0] in _blocking_errnos:
return None
raise

所以在send(content)的时候如果content类型不是bytes或bytearray而是str的话就会出现'str' does not support the buffer interface的问题.将send(content)修正为send(content.encode())就好啦.

最新文章

  1. IOS定位
  2. [转载] 不查资料确定int型整数的最大值和最小值
  3. Cocos2dx中的opengl使用(一)简单介绍
  4. C#2
  5. 函数buf_page_init
  6. HDOJ/HDU 1256 画8(绞下思维~水题)
  7. c#中string.trimstart() 和string.trimend() 的用法
  8. c#中跨线程调用windows窗体控件
  9. Angular和Spring Boot一起做个项目
  10. 笔记:XML-解析文档
  11. 一、PTA实验作业
  12. Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
  13. Linq中的左连,右连,内连
  14. Mysql数据库主从复制搭建
  15. GO语言的进阶之路-Golang高级数据结构定义
  16. PHP 中文字符串截取
  17. Hibernate查询方式(补)
  18. CentOS 7在桌面添加快捷方式
  19. groovy和java的主要区别
  20. # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解

热门文章

  1. Javascript之return
  2. POJ 1651 Multiplication PuzzleDP方法:
  3. (转载)mysql中百万级数据插入速度测试
  4. 【模拟】ECNA 2015 I What's on the Grille? (Codeforces GYM 100825)
  5. C - Catch That Cow
  6. 多台计算机之间的ssh无密钥登录
  7. .net core4
  8. 隐式intent
  9. Android Dialog透明度和暗度
  10. 基于库zkclient 的leader选举代码实现