在目标C / iOS中,python的file.read()相当于什么?

时间:2011-09-13 10:52:02

标签: python objective-c ios tumblr

说我有Python代码:

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

如何在iOS上的Objective C中复制这行代码?我正在尝试将jpg转换为字符串,用于最终的url编码,因此我可以将其传递给Tumblr API。我尝试使用base64编码将图像最初转换为字符串,但这似乎没有得到tumblr的有效响应。我也尝试过NSUTF8Encoding,但这些尝试返回nil字符串(见下文)。

为什么我这样做?来自Tumblr posted a Python example of how to submit multiple photos for a photosetresponse to this thread的人,该过程似乎开始于使用file.read()将图像转换为字符串。遗憾的是,API不采用简单的“multipart / form-data”请求,只采用“application / x-www-form-urlencoded”格式。

Python使用什么样的编码来执行此操作read(),以及如何在iPhone上的Objective C中复制它?

我尝试了以下内容:

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

这会产生nil字符串和error 261 The operation couldn’t be completed.

使用base64编码给我一个字符串,但是在对url进行编码后Tumblr API不接受它,所以我认为它没有做Python正在做的read()(尽管我可能只是缺少一个步骤)。 Tubmlr API以"status":400,"msg":"Bad Request"},"response":{"errors":["Error uploading photo."]

响应

关于uploading photos to photosets on Tumblr here的stackoverflow有一个类似的问题,但这个问题更适用于发布的Python代码。

2 个答案:

答案 0 :(得分:1)

我通过简单地记录字符串来找出答案 - 它看起来像是十六进制格式,其中\ 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

通过将图像读入NSData,然后获取描述(这是一个2位十六进制格式的字节值列表),可以在Objective C中复制上述内容。之后,您可以遍历每个字节并决定如何根据其值来表示它:

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]];
    }
}

答案 1 :(得分:0)

这就是你要找的东西吗?

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