我在使用ppython中發生
a:2:{i:0;s:28:"test::go";i:1;s:60:"files\2716e8e7046cf4bffe1fd8702170f34df97b55bb1676025694";}'
這個值為p
進入z_decode(p)轉換後
params 顯示為空白
def parse_php_req(p):
"""
解析PHP请求消息
返回:元组(模块名,函数名,入参list)
"""
while p:
v,p=z_decode(p) #v:值 p:bytes(每次z_decode计算偏移量)
params = v
modul_func = params[0] #第一个元素是调用模块和函数名
#print("模块和函数名:%s" % modul_func)
#print("参数:%s" % params[1:])
pos = modul_func.find("::")
modul = modul_func[:pos] #模块名
func = modul_func[pos+2:] #函数名
return modul, func, params[1:]
def z_decode(p):
"""
decode php param from string to python
p: bytes
"""
if p[0]==chr(0x4e): #NULL 0x4e-'N'
return None,p[2:]
elif p[0]==chr(0x62): #bool 0x62-'b'
if p[2] == chr(0x30): # 0x30-'0'
return False,p[4:]
else:
return True,p[4:]
elif p[0]==chr(0x69): #int 0x69-'i'
i = index(p, chr(0x3b), 1) # 0x3b-';'
return int(p[2:i]),p[i+1:]
elif p[0]==chr(0x64): #double 0x64-'d'
i = index(p, chr(0x3b), 1) # 0x3b-';'
return float(p[2:i]),p[i+1:]
elif p[0]==chr(0x73): #string 0x73-'s'
len_end = index(p, chr(0x3a), 2) # 0x3a-':'
str_len = int(p[2:len_end])
end = len_end + 1 + str_len + 2
v = p[(len_end + 2) : (len_end + 2 + str_len)]
#return str(v, php_python.CHARSET), p[end+1:]
return v.encode(php_python.CHARSET), p[end+1:]
elif p[0]==chr(0x61): #array 0x61-'a'
list_=[] #数组
dict_={} #字典
flag=True #类型,true-元组 false-字典
second = index(p, chr(0x3a), 2) # 0x3a-":"
num = int(p[2:second]) #元素数量
pp = p[second+2:] #所有元素
for i in range(num):
key,pp=z_decode(pp) #key解析
if (i == 0): #判断第一个元素key是否int 0
if (not isinstance(key, int)) or (key != 0):
flag = False
val,pp=z_decode(pp) #value解析
list_.append(val)
dict_[key]=val
return (list_, pp[2:]) if flag else (dict_, pp[2:])
else:
return p,''
有人可以幫忙嗎
您的代码是一个实现了PHP的序列化与反序列化的代码,这种方式是用于在PHP和其他语言之间传递数据的。代码中没有处理编码问题,因此无法解码字符串,导致出现空白。
如果要解决这个问题,您需要在代码中增加编码处理,可以通过下面这行代码:
css
Copy code
v = p[(len_end + 2) : (len_end + 2 + str_len)].decode(php_python.CHARSET)
来解决编码问题。