找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4386|回复: 8

[已解决] 谁能帮忙解释下边文件中Coding(data方法)

9

主题

33

帖子

33

积分

贫民

积分
33
奔跑的壁虎 发表于 2016-10-5 21:38:00 | 显示全部楼层 |阅读模式
def Coding(data):
  if(len(data)%2):
    data += b'\0'
  dlen = len(data)//2
  return(struct.unpack(str(dlen)+'H',data))
# short->bytes
def unCoding(data):
  d=b''
  for i in range(len(data)):
    d += struct.pack('H',data)
  return(d)
回复

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-6 18:50:05 | 显示全部楼层
  1. def Coding(data):
  2.   if(len(data)%2):
  3.     # 若data长度是奇数,在data的后边添加一个b'\0',凑成偶数
  4.         data += b'\0'
  5.   dlen = len(data)//2 # 计算得到data长度的一半dlen
  6.   return(struct.unpack(str(dlen)+'H',data)) # 以H格式将数值转换为Python类型,H格式用2字节表示一个数字,所以长度是len函数获取到的长度的一半
复制代码
回复 支持 反对

使用道具 举报

9

主题

33

帖子

33

积分

贫民

积分
33
奔跑的壁虎  楼主| 发表于 2016-10-7 20:26:47 来自手机 | 显示全部楼层
unpack不是返回的一个元组嘛?能举个例子嘛亲
回复 支持 反对

使用道具 举报

9

主题

33

帖子

33

积分

贫民

积分
33
奔跑的壁虎  楼主| 发表于 2016-10-7 20:27:22 来自手机 | 显示全部楼层
whydo1 发表于 2016-10-6 18:50

unpack不是返回的一个元组嘛?能举个例子嘛亲
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-7 23:10:01 | 显示全部楼层
  1. import struct

  2. def Coding(data):
  3.   if(len(data)%2):
  4.     # 若data长度是奇数,在data的后边添加一个b'\0',凑成偶数
  5.         data += b'\0'
  6.   dlen = len(data)//2 # 取得data长度的一半dlen
  7.   return(struct.unpack(str(dlen)+'H',data)) # 以H格式将数值转换为Python类型,H格式用2字节表示一个数字,所以长度是len函数获取到的长度的一半

  8. # short->bytes
  9. def unCoding(data):
  10.   d=b''
  11.   for i in range(len(data)):
  12.     d += struct.pack('H',data[i])
  13.   return(d)

  14. num = b'\1\2\3'
  15. dt = unCoding(num)
  16. print(dt)
  17. td = Coding(dt)
  18. print(td)
复制代码
回复 支持 反对

使用道具 举报

9

主题

33

帖子

33

积分

贫民

积分
33
奔跑的壁虎  楼主| 发表于 2016-10-9 22:16:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-10 07:49:57 | 显示全部楼层
不客气
回复

使用道具 举报

9

主题

33

帖子

33

积分

贫民

积分
33
奔跑的壁虎  楼主| 发表于 2016-10-10 22:55:18 | 显示全部楼层
本帖最后由 奔跑的壁虎 于 2016-10-10 22:57 编辑

请问输出的结果这个b'\x01\x00\x02\x00\x03\x00'长度是偶数还是奇数?
我的认识是num实参传给uncoding,那么这个实参要被转化成“H”型2个字节的python数据类型d,d又给dt,那dt肯定是偶数,if语句要不要还有什么用呢?return(struct.unpack(str(dlen)+'H',data)) 中str(dlen)不是3吗,那就是(struct.unpack('3'+'H',data))这个参数调用和struct.pack('H',data)区别是什么呢?也就是unpack与pack的区别?能否给捎带介绍一下
初学python问题有点啰嗦,有点贪心了,麻烦您了,谢谢
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-11 19:38:57 | 显示全部楼层
本帖最后由 whydo1 于 2016-10-11 19:51 编辑

请问输出的结果这个b'\x01\x00\x02\x00\x03\x00'长度是偶数还是奇数?

>>> 偶数 6

我的认识是num实参传给uncoding,那么这个实参要被转化成“H”型2个字节的python数据类型d,d又给dt,那dt肯定是偶数,if语句要不要还有什么用呢?

>>>unCoding返回的数字长度确实都是偶数. 但是传递给Coding函数的可以不是偶数. 上面的例子只是为了说明函数的作用和用法.

return(struct.unpack(str(dlen)+'H',data)) 中str(dlen)不是3吗,那就是(struct.unpack('3'+'H',data))这个参数调用和struct.pack('H',data)区别是什么呢?也就是unpack与pack的区别?

>>>pack和unpack函数用于将Python语言的数据和适合其他语言使用的数据进行相互转换. 比如象C这样的语言, 它的数据类型是有很多限制的.
>>>pack负责将Python语言的数据转换为类似C这样的语言可以接受的数据
>>>unpack负责将这类语言的数据转换为Python语言适用的数据

>>>理解一下下面的代码:
  1. dt = b'\x01\x02\x03'
  2. td = Coding(dt) # Coding使用unpack操作, 将两个字节再转换为一个字节
  3. print(td)
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表