如何在NSInputStream上设置编码类型?

时间:2015-10-29 20:55:33

标签: ios nsurlrequest foundation nsinputstream windows-1252

我需要使用Windows 1252编码将图像流式传输到.NET后端服务。因此,我认为我需要创建一个NSURLRequest,其HTTPBodyStream设置为NSInputStream,这是使用图片数据创建的。我需要将编码设置为Windows 1252或NSWindowsCP1252StringEncoding

我真的有两个问题:

  1. 如何告知NSInputStream使用NSWindowsCP1252StringEncoding传递数据或文件。
  2. 如何将UIImage转换为``NSWindowsCP1252StringEncoding`数据?我只知道base64方法。
  3. 修改

    这是模拟工作客户端的示例.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();
    

1 个答案:

答案 0 :(得分:1)

  1. 您不能告诉NSInputStream要使用的编码,因为NSInputStream不会对字符串进行操作。 NSInputStream为您提供原始字节。您有责任使用您想要的任何输入格式解码这些字节。

    此外,由于您“需要将图像流式传输到.NET后端服务”,我认为您需要NSOutputStream,而不是NSInputStream。但它是同样的交易:你给输出流提供原始字节。您必须自己将字符串编码为字节。

  2. 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];