Как я устанавливаю тип кодировки на 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();

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];
    
Другие вопросы по тегам