如何在 NSInputStream 上设置编码类型?
How do I set an encoding type on NSInputStream?
我需要使用 Windows 1252 编码将图像流式传输到 .NET 后端服务。所以我相信我需要创建一个 NSURLRequest
并将其 HTTPBodyStream
设置为使用图像数据创建的 NSInputStream
。我需要将编码设置为 Windows 1252 或 NSWindowsCP1252StringEncoding
.
我真的有两个问题:
- 如何告诉
NSInputStream
使用 NSWindowsCP1252StringEncoding
作为其传入的数据或文件。
- 如何将 UIImage 转换为 ``NSWindowsCP1252StringEncoding` 数据?我只知道base64方法。
编辑:
这是模拟工作客户端的示例 .NET 代码。
wr.Method = "POST";
wr.ContentType = "application/octet-stream";
wr.UseDefaultCredentials = true;
string ImagePath = @"C:\Users\smith\Desktop\Cat-and-dog.jpg";
byte[] ibuffer = File.ReadAllBytes(ImagePath);
wr.ContentLength = ibuffer.Length;
Stream pData = wr.GetRequestStream();
pData.Write(ibuffer, 0, ibuffer.Length);
pData.Close();
HttpWebResponse wres = wr.GetResponse() as HttpWebResponse;
Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader strRdr = new StreamReader(wres.GetResponseStream(), enc);
string resp = strRdr.ReadToEnd();
你不告诉NSInputStream
使用什么编码,因为NSInputStream
不对字符串进行操作。 NSInputStream
为您提供原始字节。您有责任使用您想要的任何输入格式解码这些字节。
此外,由于您“需要将图像流式传输到 .NET 后端服务”,我认为您需要 NSOutputStream
,而不是 NSInputStream
。但这是一样的:您将原始字节提供给输出流。您必须自己将字符串编码为字节。
将 UIImage
转换为任何字符编码的想法有点荒谬,因为 UIImage
是像素数据,而不是文本。您首先必须解码要如何对像素数据进行编码。假设您想使用 PNG 对其进行编码:
UIImage *image = ...
NSData *imageData = UIImagePNGRepresentation(image);
NSData *imageBase64Data = [imageData base64EncodedDataWithOptions:0];
此时,imageBase64Data
包含图像,编码为PNG,编码为base 64,编码为UTF-8。您可能认为这是错误的字符编码,但 base 64 编码仅使用可打印的 ASCII 字符。由于CP1252和UTF-8都是ASCII的超集,所以imageBase64Data
的内容对CP1252也是有效的。
如果您希望对字符串进行显式编码,您可以这样做:
NSString *imageBase64String = [imageData base64EncodedStringWithOptions::0];
NSData *imageBase64Data = [imageBase64String dataUsingEncoding: NSWindowsCP1252StringEncoding];
我需要使用 Windows 1252 编码将图像流式传输到 .NET 后端服务。所以我相信我需要创建一个 NSURLRequest
并将其 HTTPBodyStream
设置为使用图像数据创建的 NSInputStream
。我需要将编码设置为 Windows 1252 或 NSWindowsCP1252StringEncoding
.
我真的有两个问题:
- 如何告诉
NSInputStream
使用NSWindowsCP1252StringEncoding
作为其传入的数据或文件。 - 如何将 UIImage 转换为 ``NSWindowsCP1252StringEncoding` 数据?我只知道base64方法。
编辑:
这是模拟工作客户端的示例 .NET 代码。
wr.Method = "POST";
wr.ContentType = "application/octet-stream";
wr.UseDefaultCredentials = true;
string ImagePath = @"C:\Users\smith\Desktop\Cat-and-dog.jpg";
byte[] ibuffer = File.ReadAllBytes(ImagePath);
wr.ContentLength = ibuffer.Length;
Stream pData = wr.GetRequestStream();
pData.Write(ibuffer, 0, ibuffer.Length);
pData.Close();
HttpWebResponse wres = wr.GetResponse() as HttpWebResponse;
Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader strRdr = new StreamReader(wres.GetResponseStream(), enc);
string resp = strRdr.ReadToEnd();
你不告诉
NSInputStream
使用什么编码,因为NSInputStream
不对字符串进行操作。NSInputStream
为您提供原始字节。您有责任使用您想要的任何输入格式解码这些字节。此外,由于您“需要将图像流式传输到 .NET 后端服务”,我认为您需要
NSOutputStream
,而不是NSInputStream
。但这是一样的:您将原始字节提供给输出流。您必须自己将字符串编码为字节。将
UIImage
转换为任何字符编码的想法有点荒谬,因为UIImage
是像素数据,而不是文本。您首先必须解码要如何对像素数据进行编码。假设您想使用 PNG 对其进行编码:UIImage *image = ... NSData *imageData = UIImagePNGRepresentation(image); NSData *imageBase64Data = [imageData base64EncodedDataWithOptions:0];
此时,
imageBase64Data
包含图像,编码为PNG,编码为base 64,编码为UTF-8。您可能认为这是错误的字符编码,但 base 64 编码仅使用可打印的 ASCII 字符。由于CP1252和UTF-8都是ASCII的超集,所以imageBase64Data
的内容对CP1252也是有效的。如果您希望对字符串进行显式编码,您可以这样做:
NSString *imageBase64String = [imageData base64EncodedStringWithOptions::0]; NSData *imageBase64Data = [imageBase64String dataUsingEncoding: NSWindowsCP1252StringEncoding];