我需要将字节数组转换为UTF8字符串,并保留数组中的字符。
我使用多部分帖子上传图片。图像以UTF8字符串形式发送。我比较了我的应用程序和Web浏览器中的标题,除了一件事之外,数据是相同的。
当它沿浏览器发送时,内容包含许多[]字符,我的应用程序用?替换[]。这意味着它不会保留应有的字符。其他一切都是一样的。
下面是我的代码
Byte[] fileOpen = File.ReadAllBytes("C:/pic.jpeg");
postData.AppendLine(System.Text.Encoding.UTF8.GetString(fileOpen));
有什么建议吗?
答案 0 :(得分:6)
图像以UTF8字符串形式发送。
为什么呢? UTF-8是文本编码。原始二进制数据不应编码,而应直接作为字节发送。
如果你的传输协议不允许字节传输,那么通常的方法是在Base64中对byes进行编码。
答案 1 :(得分:2)
请勿尝试使用接近文本API的任何内容发送数据。你还没有说postData
是什么,但试图找到其API的一部分来处理二进制数据流而不是文本数据。查找AppendBytes
或GetStream
行的方法,以检索您可以将数据写入的流。
假装任意二进制数据是文本是一个坏主意 - 你将丢失数据。
编辑:倾向于不丢失数据(但仍然是个坏主意)的一种方法是将二进制数据视为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帐户,请自行测试。如果需要,我会发布一个有效的视频,只是为了证明我的观点。