关于python3中struct.error: argument for 's' must be a bytes object的解决办法

关于python3中struct.error: argument for 's' must be a bytes object的解决办法

问题说明

笔者是一名新入门新手,本篇文章也是给入坑新手写的,希望能给遇到此类错误的小伙伴一点提示,防止像我一样走弯路。
笔者使用的python版本为python3.6,在学习使用tftp服务端下载文件时,编写了如下的通信demo,结果报错。

from socket import *
import struct
sendData = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.sendto(sendData, ("192.168.1.32", 69))
udpSocket.close()

提示错误如下:

Traceback (most recent call last):
    sendData = struct.pack("!H8sb5sb",1,x1,0,"octet",0)
struct.error: argument for 's' must be a bytes object

解决思路

首先搜索了网友的解决办法,给我提示比较多的是链接: python3中的UNICODE 与 UTF-8的简单关系.
我的理解是python3中默认的字符串为Unicode格式,而struct的函数中需要传的参数必须为“utf-8”格式,因此需要在文件开头手动声明编码格式“# coding = unf-8”
如下所示

# coding=utf-8   #  注意这里!!!!
from socket import *
import struct
s = "test.jpg"
sendData = struct.pack("!H8sb5sb",1,s.encode("utf-8"),0,"octet",0) # 这句代码中的“test.jpg”进行了编码
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.sendto(sendData, ("192.168.1.32", 69))
udpSocket.close()

结果仍然是同样的错误,百思不得其解!!!!
思索良久,突然想起上段加粗的那句话

sendData = struct.pack("!H8sb5sb",1,s.encode("utf-8"),0,"octet",0)

在上面一句代码中,“octet”也需要转换格式,于是最终的正确的代码如下:

# coding=utf-8       #  注意这里!!!!
from socket import *
import struct
s = "test.jpg"
sendData = struct.pack("!H8sb5sb",1,s.encode("utf-8"),0,("octet").encode("utf-8"),0)      
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.sendto(sendData, ("192.168.1.32", 69))
udpSocket.close()
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值