首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任何ascii85/base85编码器/解码器的iOS?

任何ascii85/base85编码器/解码器的iOS?
EN

Stack Overflow用户
提问于 2012-03-06 16:33:52
回答 1查看 1.3K关注 0票数 0

看起来base64 encoding and decoding已经不是问题了,但是...

有人有ascii85编码器/解码器的实现,或者知道库吗?

PS: BASE85用于例如RFC1924

EN

回答 1

Stack Overflow用户

发布于 2015-05-15 17:25:22

这是我自己做的一个objective-c移植。它起作用了。

代码语言:javascript
复制
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包装器:

代码语言:javascript
复制
+(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];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9580246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档