Как установить тип кодирования в NSInputStream?

Мне нужно передать изображение в серверную службу .NET, используя кодировку Windows 1252. Поэтому я считаю, что мне нужно создать NSURLRequest с его HTTPBodyStream, установленным на NSInputStream, который создается с данными изображения. И мне нужно, чтобы кодировка была установлена ​​​​на Windows 1252 или NSWindowsCP1252StringEncoding.

У меня действительно два вопроса:

  1. Как сообщить NSInputStream использовать NSWindowsCP1252StringEncoding для передачи данных или файла.
  2. Как преобразовать 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();

person Steve Moser    schedule 29.10.2015    source источник


Ответы (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];
    
person rob mayoff    schedule 29.10.2015
comment
Спасибо. Я согласен, что это не имеет смысла для меня, но это спецификация. Я разместил клиент .NET, который работает в качестве примера. - person Steve Moser; 30.10.2015
comment
Я не знаю .NET, но мне кажется, что ваш пример кода записывает необработанные данные JPEG в сокет без какой-либо кодировки. - person rob mayoff; 30.10.2015