2012-03-06 15 views

答えて

1

自分で何かが必要なので、書きました。 Here's an Objective C implementation。それは、アドビバージョンではなくRFC 1924文字セットを使用することに注意してください。助けてくれたら教えてください!

1

あなたがこれを確認しましたか? MITライセンスのコード200行:http://www.remyoukaour.com/projects/ascii85/ ココアの文字列やファイルなどを使用するには大きな作業ではありません。

+0

THX、あなたが参照されるソースは(Cで書かれているあなたは、私がREFEREウィキペディアのページでそれを見つけることができますに)。しかし、私は客観的な実装を優先します。 – Stephan

+0

後者は前者の厳密なスーパーセットであるため、CコードはObjective C環境でうまく動作します。あなたはまた、NSStringや友人のすべての関数を見つけることができます結果を変換するchar *。あるいは、コードが〜200行しかないので、objのコードをフレームワーククラスで簡単に書き換えることができます。 – MrTJ

+0

Objective-CではCを使用できます。 –

0

私が自分で行った目的の移植です。できます。ここで

static unsigned long pow85[] = { 
85*85*85*85, 85*85*85, 85*85, 85, 1 
}; 

void wput(unsigned char* output, unsigned long tuple, int bytes) { 
for(int i=0; i<bytes; i++) 
    output[i] = (tuple>>((3-i)*8)) & 0xFF; 
} 

int decode85(const char* input, unsigned char *output) { 
unsigned long tuple = 0; 
int c, count = 0, posInput = 0, posOutput = 0; 
for (;;) 
    switch (c = input[posInput++]) { 
     default: 
      if (c < '!' || c > 'u') { 
       NSLog(@"bad character in ascii85 region: %#o", c); 
       return -1; 
      } 
      tuple += (c - '!') * pow85[count++]; 
      if (count == 5) { 
       wput(output+posOutput, tuple, 4); 
       posOutput += 4; 
       count = 0; 
       tuple = 0; 
      } 
      break; 
     case 'z': 
      if (count != 0) { 
       NSLog(@"z inside ascii85 5-tuple"); 
       return -1; 
      } 
      output[posOutput++] = '\0'; 
      output[posOutput++] = '\0'; 
      output[posOutput++] = '\0'; 
      output[posOutput++] = '\0'; 
      break; 
     case '~': 
      if ((input[posInput] == '>')||(input[posInput] == '\0')) { 
       posInput++; 
       if (count > 0) { 
        count--; 
        tuple += pow85[count]; 
        wput(output+posOutput, tuple, count); 
        posOutput += count; 
       } 
       c = input[posInput++]; 
       return posOutput; 
      } 
      NSLog(@"~ without > in ascii85 section"); 
      return -1; 
     case '\n': case '\r': case '\t': case ' ': 
     case '\0': case '\f': case '\b': case 0177: 
      break; 
     case EOF: 
      NSLog(@"EOF inside ascii85 section"); 
      return -1; 
     } 
} 

は、あなたのクラスに含めるのObjective-Cのラッパーです:答えを

+(NSData*)decodeAscii85:(NSString*) sEncoded 
{ 
char* sBuffer = (char*)malloc(sEncoded.length+1); 
if(![sEncoded getCString:sBuffer maxLength:(sEncoded.length+1) encoding:NSASCIIStringEncoding]) 
{ 
    free(sBuffer); 
    return nil; 
} 

unsigned char* sOutBuffer = (unsigned char*)malloc(sEncoded.length+1); 
int nLength = decode85(sBuffer, sOutBuffer); 
free(sBuffer); 
if(nLength == -1) 
{ 
    free(sOutBuffer); 
    return nil; 
} 

return [NSData dataWithBytesNoCopy:sOutBuffer length:nLength freeWhenDone:YES]; 
} 
関連する問題