无法在python

时间:2017-11-01 08:19:01

标签: python protocol-buffers decode encode

我正在使用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;
}

1 个答案:

答案 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)