C# 将二进制(Excel)数据转换为HTTP请求的字符串

C# 将二进制(Excel)数据转换为HTTP请求的字符串,c#,http,encoding,character-encoding,binary,C#,Http,Encoding,Character Encoding,Binary,我正在尝试将二进制数据(Excel XLS文件)转换为可以作为HTTP多部分请求的一部分传递的数据(生成多部分请求的代码已经处理字符串数据一段时间了,因此我认为二进制数据的编码是问题所在,而不是请求的形成方式) 对于ref,Excel文件的前七个字符(在记事本++中查看时)为: 我正在使用 binaryContent = System.IO.File.ReadAllBytes(filePath); 如果我使用 content.Append(Encoding.UTF8.GetString(ele

我正在尝试将二进制数据(Excel XLS文件)转换为可以作为HTTP多部分请求的一部分传递的数据(生成多部分请求的代码已经处理字符串数据一段时间了,因此我认为二进制数据的编码是问题所在,而不是请求的形成方式)

对于ref,Excel文件的前七个字符(在记事本++中查看时)为:

我正在使用

binaryContent = System.IO.File.ReadAllBytes(filePath);
如果我使用

content.Append(Encoding.UTF8.GetString(element.BinaryContent));
要创建由此提供的HTTP请求内容(从VS中的即时窗口):

在上传的文件中,控制字符和英文字符被正确保留,但其他字符被转换为不正确的值

如果我没有很好地解释这一点,下图显示了左侧上传的数据和右侧的原始数据

对于ref,我是如何使用以下命令发出请求的:

    protected static void SetRequestContent(string requestContent, HttpWebRequest request, string contentType)
    {
        request.ContentType = contentType;

        byte[] byteData = UTF8Encoding.UTF8.GetBytes(requestContent);

        using (Stream postStream = request.GetRequestStream())
        {
            postStream.Write(byteData, 0, byteData.Length);
        }
    }
其中,
requestContent
已正确形成多部分内容,如下所示:

--------------------------BNDY
Content-Disposition: form-data; name=password
Txxxxx
--------------------------BNDY
Content-Disposition: form-data; name=username
a@b.com
--------------------------BNDY
Content-Disposition: form-data;name=\"FILE\";filename=\"c:/POSTOutput/Upload.xls\"
��\u0011\u0871\u001a�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\u0003\0��\t\0\u0006\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\u0010\0\0\u0002\0\0\0\u0001\0\0\0����\0\0\0\0\0\0\0\0������������ (etc). 
我需要做什么才能以原始格式传递数据?

您的代码行

content.Append(Encoding.UTF8.GetString(element.BinaryContent));
假设任意字节序列(来自没有固有字符编码的二进制文件)始终可以转换为Unicode字符串。情况并非如此:-未定义的代码点可能导致替换(回退),甚至导致
参数异常

如果必须具有字符串,请改用base64之类的健壮编码:

content.Append(Convert.ToBase64String(element.BianryContent));
更好的方法是:使用子部分的
type
属性指定MIME类型(application/vnd.ms-excel用于xls,与xlsx不同),因此您根本不需要编码,而是直接将原始字节序列提交到流

参考文献:
-您的代码行

content.Append(Encoding.UTF8.GetString(element.BinaryContent));
假设任意字节序列(来自没有固有字符编码的二进制文件)始终可以转换为Unicode字符串。情况并非如此:-未定义的代码点可能导致替换(回退),甚至导致
参数异常

如果必须具有字符串,请改用base64之类的健壮编码:

content.Append(Convert.ToBase64String(element.BianryContent));
更好的方法是:使用子部分的
type
属性指定MIME类型(application/vnd.ms-excel用于xls,与xlsx不同),因此您根本不需要编码,而是直接将原始字节序列提交到流

参考文献:

-

AFAIK,多部分块通常使用base64AFAIK编码,多部分块通常使用base64编码