2011-05-23 12 views
0

私はKERN_PROTECTION_FAILUREをどこかで取得しています(スタックトレースはメインループで起こっていることを示していますが、前回のループでメモリが壊れているように見えるため詳細はわかりません)。 )(iphone)base64エンコーディング

次のコードを削除すると、症状が消えます。私は奇妙見つける何How do I do base64 encoding on iphone-sdk?
、base64エンコードを得るための他の方法がある参照
Verify receipt for in App purchase E)

- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

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

は、「長さ」が異なって計算されていることです。
((4以上の長さ2/3)*、およびlentext * 4/3 +下記4。
は誰でも以下のコードを使用して、横に?
に何が起こっているかを伝えることができ、私は「レシートデータ不正な形式を取得私はリンゴのサーバーへの符号化データを渡す」というエラー

+ (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; 
} 

答えて

関連する問題