(iphone)base64编码

我在某处得到KERN_PROTECTION_FAILURE(堆栈跟踪显示它正在主循环中发生,但不会提供更多详细信息,因为似乎在先前循环中内存已损坏。我具有所有设置可以正确查看调试输出) 当我删除调用以下代码时,症状消失了。 (验证应用内购买者的收据)
- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
    static char table[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
                value <<= 8;

                if (j < length) {
                        value |= (0xFF & input[j]);
                }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    table[(value >> 18) & 0x3F];
        output[index + 1] =                    table[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : \'=\';
        output[index + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : \'=\';
    }

    return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}
我看到还有其他获取base64编码的方法,如何在iphone-sdk上进行base64编码? 我觉得很奇怪的是,“长度”的计算方式有所不同。 ((length +2/3)* 4以上,lentext * 4/3 + 4以下。 谁能告诉我发生了什么事? 另外,使用下面的代码,当我将编码后的数据传递给Apple服务器时,我收到“接收数据格式错误”错误。
+ (NSString *) base64StringFromData: (NSData *)data length: (int)length {
int lentext = [data length]; 
if (lentext < 1) return @\"\";

char *outbuf = malloc(lentext*4/3+4); // add 4 to be sure

if ( !outbuf ) return nil;

const unsigned char *raw = [data bytes];

int inp = 0;
int outp = 0;
int do_now = lentext - (lentext%3);

for ( outp = 0, inp = 0; inp < do_now; inp += 3 )
{
    outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2];
    outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)];
    outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)];
    outbuf[outp++] = base64EncodingTable[raw[inp+2] & 0x3F];
}

if ( do_now < lentext )
{
    char tmpbuf[2] = {0,0};
    int left = lentext%3;
    for ( int i=0; i < left; i++ )
    {
        tmpbuf[i] = raw[do_now+i];
    }
    raw = tmpbuf;
    outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2];
    outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)];
    if ( left == 2 ) outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)];
}

NSString *ret = [[[NSString alloc] initWithBytes:outbuf length:outp encoding:NSASCIIStringEncoding] autorelease];
free(outbuf);

return ret;
}
    
已邀请:
我正在使用这个很小的库对Base64进行编码/解码:http://imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php 它完成了它的工作,并且我假设您使用它的类似版本。您是否尝试在第一次使用之前致电
+initialize
?     

要回复问题请先登录注册