我正在使用protobuf传递散列字节数组。但在尝试反序列化时,我收到以下错误:
'utf-8'编解码器无法解码位置1中的字节0xd6:'utf-8'编解码器 无法解码位置1中的字节0xd6:无效的连续字节 field:master.hash1
代码很简单:
a = message.ParseFromString(data)
我相信编码\解码很简单,但我不知道怎么做。
这是用c#编码数据的代码:
public byte[] HmacSign(string key, string message)
{
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
return hashmessage;
}
答案 0 :(得分:0)
您正在使用ASCII对数据进行编码,因此您还必须使用ASCII进行解码:
s = str(data, 'ascii')
message.ParseFromString(s)
如果您更喜欢使用UTF-8,请更改c#代码的编码:
public byte[] HmacSign(string key, string message)
{
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
return hashmessage;
}
然后在你的python代码中使用UTF-8:
s = str(data, 'utf-8')
message.ParseFromString(s)
修改强>
如果仍然无效,请尝试从c#代码中返回一个字符串:
public string HmacSign(string key, string message)
{
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha new HMACSHA1(keyByte))
{
byte[] hashmessage = hmacsha.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
}
在你的Python代码中:
import base64
s = base64.b64decode(data).decode('utf-8')
message.ParseFromString(s)