Что эквивалентно python file.read () в целевой C / iOS? - PullRequest
1 голос
/ 13 сентября 2011

Скажите, что у меня есть код Python:

someString = file("filename.jpg").read()

Как мне воспроизвести эту строку кода в Objective C на iOS? Я пытаюсь преобразовать JPG в строку для возможного кодирования URL, чтобы я мог передать его в API Tumblr. Я попробовал кодирование base64, чтобы сначала преобразовать изображение в строку, но, похоже, от tumblr это не получилось. Я также пробовал NSUTF8Encoding, но эти попытки возвращают ноль строк (см. Ниже).

Почему я это делаю? Кто-то из Tumblr опубликовал пример Python о том, как отправить несколько фотографий для фотосета в ответе на эту тему , и процесс, по-видимому, начинается с преобразования изображений в строки с использованием file.read (). К сожалению, API не принимает простой запрос «multipart / form-data», а только формат «application / x-www-form-urlencoded».

Какую кодировку использует Python для чтения (), и как я могу скопировать ее в Objective C на iPhone?

Я пробовал следующее:

NSString *utf8String = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"jpg"] encoding:NSUTF8StringEncoding error:&error];

Это дает nil строку и error 261 The operation couldn’t be completed.

Использование кодирования base64 дает мне строку, но API Tumblr не принимает ее после URL-кодирования, поэтому я предполагаю, что он не делает то, что делает Python с read () (хотя я мог просто пропустить шаг). API Tubmlr отвечает "status":400,"msg":"Bad Request"},"response":{"errors":["Error uploading photo."]

Существует аналогичный вопрос о stackoverflow о загрузке фотографий в фотосеты на Tumblr здесь , но этот вопрос более специфичен для опубликованного кода Python.

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Я понял ответ, просто записав строку - похоже, это шестнадцатеричный формат, где \ xXX, где XX - шестнадцатеричный код для каждого байта, с заменами ASCII для некоторых легко печатных символов.

\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00\x1d\x08\x06\x00\x00\x00\xcb\x9en\x87\x00\x00\x01\xc9IDATH\r\xc5\x971K\x03A\x10\x85s\nB \x10\xb0\n\xa4\xb2J\x95* \x08\x82\x95\xbfA\x10\xfc\x01V\xb6\x82\x95?\xc0J\x10\x04[[\xc16U@\xb0\x8d`/(\x8a\x82\x08Z\t\x12\x89\xdf$\xd9p\x9c\xae\xfb&\x9c8\xf0\xd8\xbd\xdb\xb7o^\xe6\x96\xb9K6\x1c\x0e+\xb3D\x96e\xf3\xeck\xb3\xffj\x96\xfda\xcf\\\x98\xa8#\x89\xdb\xe0\x1c\xfe\x00\xf4\x99\x0f@\x17\xec\x80\xba\xaa3\xe5Y\x05\x14\xb0\xa1\x06\x0e\xc0=\xb0\xb2\xfd\x84\x17\xee\xaf(z\x81#%72\xb1\x1bIZ4r\x03\xaf\x16\x12\xa4F\xc9\x00\x82\xf6\xbcM\xb8\x98,v\xbd\x9fJ\x1c\xd6\xd53\xd0 \xf9\x12Pc]%\xaa\x06\x9e\x11\xfcTE\xe1\xd9y\x91B2@\xb9>P{\x90\x14\xc7$\xe3K!\x19\x98(Y\x15\xd4xR\x89\x1e\x03\xef\xaa(\xbc7\x95\xeb1\xd0RE\xe1-\xab\\\x8f\x01\xcf\x19\xb8\xfb\x0b\x03\x9e\x9e\x7f\xad\x1a\x90\x1a\x915\rb\x15\xdc\x82X\xf3\t\xf7\x1f\xe1tB\xa3I\x8d\xb2\x81\x89\x89=\xc1\xc0v*i~\xdds\x06\xc8]QJ\xabpLk\x1cy7\xa99;\x16@\x1f\x84r\x17\xc7K\xe3\xa4t\xf2\xeb\xde\n\xd8;\xe1\xb7\x13n\xcd\xca^\\z\xe4\xdd\xa4\xe6\xa8^\x80\xe2\xaf.^\x9f\xa4t\xf2\xeb\xd2!$i\x13\x1c\n\xc9\x83\x993\xb8\xad|\xa2\xd8<j\x00\x01{\xde\x9b\xa0\x0b\x82\xb0w\xec\xb1w\x0bTe\x03\x90;\xc0~\xad}^y\x13\xc6\xf8\xafh\x1d\x81o\xfdaZ\x01\x167\x80\xf2\x8ccI\xd4\xfb=\xf2\xac\x85\x8a\x8c\x0cp\xe3\x14\xa8\x02e\xf1\x8e\xcd\x84\x85}>\x95%\xea\xd5iX\x1f\xf0|\xeb\x99\xe12\xa3i\x06\xfc\x7f&\xca\xb30\xaa\xc0byzn\xa5\xbaU\xe0?\rT\xbf\x00\x87\x89 \xa8s3+7\x00\x00\x00\x00IEND\xaeB`\x82

Вышеприведенное можно повторить в Objective C, прочитав изображение в NSData, а затем получив описание (представляющее собой список двухзначных значений байтов в шестнадцатеричном формате). После этого вы можете просмотреть каждый байт и решить, как его представить, основываясь на его значении:

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"anImage" ofType:@"jpg"]];
NSString *hexFormatString = [data describe];
hexFormatString = [[hexFormatString stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
NSMutableString * newString = [NSMutableString string];    
for (int x=0; x<[hexFormatString length]; x+=2) {
    NSString *component = [hexFormatString substringWithRange:NSMakeRange(x, 2)];
    int value = 0;
    sscanf([component cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
    if ((value <=46 && value >= 45) || (value <=57 && value >= 48) || (value <=90 && value >= 65) || (value == 95) || (value <=122 && value >= 97)) {  //48-57, 65-90, 97-122
        [newString appendFormat:@"%c", (char)value];
    }
    else {
        [newString appendFormat:@"%%%@", [component uppercaseString]];
    }
}
0 голосов
/ 13 сентября 2011

Это то, что вы ищете?

NSData *data = [NSData dataWithContentsOfFile:@"filename.jpg"];
NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]
...