将Base64字符串从C#传输到Python,反之亦然

2024-09-29 23:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个包括通过套接字传输文件的项目。我的服务器是用python编写的,客户机是用C编写的。由于Python在字符集方面不是很友好,所以我将从客户机上传的文件转换成base64,然后用Python解码。它工作得很好。由于某些原因,当我做相反的事情时,当我用python编码文本并在传输后解码时,会抛出错误。 看一看- 这是从客户端到服务器的正确发送:

List<byte> b = Encoding.ASCII.GetBytes(Convert.ToBase64String(cont)).ToList();
int size = Encoding.ASCII.GetByteCount(st) + b.Count;
string pack = size + ":" + st;
buffer = Encoding.ASCII.GetBytes(pack);
List<byte> a = buffer.ToList();
a.AddRange(b);
connection.Send(a.ToArray());

和python:

^{pr2}$

这很管用。 当我做相反的操作(使用相同的库时,会出错):

string res = SendRecv("1?" + basepath + v[0]);
res = res.Remove(res.Length - 1).Substring(1);//because it is sent quoted

byte[] converted = Convert.FromBase64String(res.Replace(" ",String.Empty));
saved.Write(converted, 0, converted.Length);
saved.Close();

SendRecv(send和recv)方法:

    private void Send(string st)
    {
        int size = Encoding.ASCII.GetByteCount(st);
        string pack = size + ":" + st;
        buffer = Encoding.ASCII.GetBytes(pack);
        connection.Send(buffer);
    }
    private string Recv()
    {
        try
        {
            buffer = new byte[2];
            connection.Receive(buffer, 2, SocketFlags.Partial);
            string header = Encoding.ASCII.GetString(buffer, 0, 2);
            while (!header.Contains(":"))
            {
                connection.Receive(buffer, 2, SocketFlags.Partial);
                header += Encoding.ASCII.GetString(buffer, 0, 2);
            }
            int size = int.Parse(header.Split(':')[0]);
            string mes0 = header.Split(':')[1];
            buffer = new byte[size];
            int b = 0;
            int s = (size >= 2048) ? 2048 : size;
            while(size-s > 0)
            {
                connection.Receive(buffer,b,s,SocketFlags.None);
                size -= s;
                s = (size >= 2048) ? 2048 : size;
                b += s;
            }
            connection.Receive(buffer, size, SocketFlags.None);
            string fullmes = mes0 + Encoding.ASCII.GetString(buffer);


            return fullmes;
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        return "";
    }
    private string SendRecv(string a)
    {
        Send(a);
        return Recv();
    }

Python:

return base64.b64encode(self.finalResult.getContent())

它抛出了一个例外:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters


Tags: sendsizestringbufferasciiresbyteconnection

热门问题