字节数组为UTF8字符串

时间:2010-02-21 11:30:00

标签: c#

我需要将字节数组转换为UTF8字符串,并保留数组中的字符。

我使用多部分帖子上传图片。图像以UTF8字符串形式发送。我比较了我的应用程序和Web浏览器中的标题,除了一件事之外,数据是相同的。

当它沿浏览器发送时,内容包含许多[]字符,我的应用程序用?替换[]。这意味着它不会保留应有的字符。其他一切都是一样的。

下面是我的代码

Byte[] fileOpen = File.ReadAllBytes("C:/pic.jpeg");
postData.AppendLine(System.Text.Encoding.UTF8.GetString(fileOpen));

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

  

图像以UTF8字符串形式发送。

为什么呢? UTF-8是文本编码。原始二进制数据不应编码,而应直接作为字节发送。

如果你的传输协议不允许字节传输,那么通常的方法是在Base64中对byes进行编码。

答案 1 :(得分:2)

请勿尝试使用接近文本API的任何内容发送数据。你还没有说postData是什么,但试图找到其API的一部分来处理二进制数据流而不是文本数据。查找AppendBytesGetStream行的方法,以检索您可以将数据写入的流。

假装任意二进制数据是文本是一个坏主意 - 你将丢失数据。

编辑:倾向于不丢失数据(但仍然是个坏主意)的一种方法是将二进制数据视为ISO-8859-1编码的文档。 IIRC对于ISO-8859-1在128-159位置中究竟包含什么有一些争论,但大多数编码至少也假设为Unicode 128-159。

二进制数据的“UTF-8解码”可能看起来像正确的数据,因为对于值0-127,它们是相同的 - 只有高于你才会遇到问题。但是,您仍应避免将此二进制数据视为文本。这是不是文本,将其视为文本只是灾难的一种方法。

如果您可以发布浏览器发送的标题(包括与图像对应的多部分部分的标题),我们希望能够进一步帮助您 - 但最重要的是您应该找到一种方法处理您正在使用的任何API(这也是有用的信息)原始二进制数据,而不通过文本。

答案 2 :(得分:0)

约翰和其他人说他们不相信我。我已经解决了。将其转换为字符串会导致问题,但直接将其写入请求流有效。

public string solveCaptcha(String username, String password)
    {
        String boundry = "---------------------------" + DateTime.Now.Ticks.ToString("x");

        StringBuilder postData = new StringBuilder();
        postData.AppendLine("--" + boundry);
        postData.AppendLine("Content-Disposition: form-data; name=\"function\"");
        postData.AppendLine("");
        postData.AppendLine("picture2");
        postData.AppendLine("--" + boundry);
        postData.AppendLine("Content-Disposition: form-data; name=\"username\"");
        postData.AppendLine("");
        postData.AppendLine(username);
        postData.AppendLine("--" + boundry);
        postData.AppendLine("Content-Disposition: form-data; name=\"password\"");
        postData.AppendLine("");
        postData.AppendLine(password);
        postData.AppendLine("--" + boundry);
        postData.AppendLine("Content-Disposition: form-data; name=\"pict\"; filename=\"pic.jpeg\"");
        postData.AppendLine("Content-Type: image/pjpeg");
        postData.AppendLine("");

        StringBuilder postData2 = new StringBuilder();
        postData2.AppendLine("\n--" + boundry);
        postData2.AppendLine("Content-Disposition: form-data; name=\"pict_to\"");
        postData2.AppendLine("");
        postData2.AppendLine("0");
        postData2.AppendLine("--" + boundry);
        postData2.AppendLine("Content-Disposition: form-data; name=\"pict_type\"");
        postData2.AppendLine("");
        postData2.AppendLine("0");
        postData2.AppendLine("--" + boundry + "--");

        Byte[] fileOpen = File.ReadAllBytes("C:/pic.jpeg");
        byte[] buffer = Encoding.ASCII.GetBytes(postData.ToString());
        byte[] buffer2 = Encoding.ASCII.GetBytes(postData2.ToString());

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://poster.decaptcher.com/");

        request.ContentType = "multipart/form-data; boundary=" + boundry;
        request.ContentLength = buffer.Length + buffer2.Length + fileOpen.Length;
        request.Method = "POST";

        String source = "";

        using (Stream PostData = request.GetRequestStream())
        {
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Write(fileOpen, 0, fileOpen.Length);
            PostData.Write(buffer2, 0, buffer2.Length);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                Byte[] rBuf = new Byte[8192];
                Stream resStream = response.GetResponseStream();
                string tmpString = null;
                int count = 0;
                do
                {
                    count = resStream.Read(rBuf, 0, rBuf.Length);
                    if (count != 0)
                    {
                        tmpString = Encoding.ASCII.GetString(rBuf, 0, count);
                        source += tmpString;
                    }
                } while (count > 0);

            }
        }
        MessageBox.Show(source);
        // Do something with the source
        return source;
    }

如果您有deCaptcher帐户,请自行测试。如果需要,我会发布一个有效的视频,只是为了证明我的观点。