OC sha1+base64加密 以及 十进制转十六进制

来源:互联网 发布:淘宝提前收款不能用了 编辑:程序博客网 时间:2024/06/05 20:15

java程序平移IOS中遇到加密问题。

java代码:

public static String getDigest( String algorithm, String data )    {StringBuffer s = new StringBuffer();try{MessageDigest md = MessageDigest.getInstance( algorithm );byte[] dat = data.getBytes();md.update( dat );byte[] digest = md.digest();for( int i=0 ; i < digest.length ; i++ ){int d = digest[ i ];if( d < 0 ){// byte 128-255d+= 256 ;}if( d < 16 ){// 0-15 16s.append( "0" );}s.append( Integer.toString( d, 16 ) );}}catch( Exception e ){}return s.toString();}

java中的digest是有符号10进制的整数。需要注意的是,转成16进制是需要补位的,否则 遇到0A~0F会丢掉“0”。

OC中可以使用int8_t类型(有符号)或者uint8_t(无符号)代替。uint8_t是会自动补位补零的!

OC中 10进制转16进制的方法:

 [NSString stringWithFormat:@"%x" , 数字];  //%d 为10进制输出 %x 为16进制输出

OC代码:

+ (NSString *) sha1_base64:(NSString *) str {        const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];        NSData *data = [NSData dataWithBytes:cstr length:str.length];        uint8_t digest[CC_SHA1_DIGEST_LENGTH];//  int8_t digest[CC_SHA1_DIGEST_LENGTH];   //使用int8_t时,循环中需要做补零处理。        CC_SHA1(data.bytes, data.length, digest);    NSMutableString *output = [[NSMutableString alloc]init];        for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {        int d = digest[i];                //补零处理//        if (d < 0) {//            d += 256;//        }//        if (d < 16) {//            [outStr appendString:@"0"];//        }                NSString *tmpStr = [NSString stringWithFormat:@"%x" ,d];    //%d 为10进制输出   %x 为16进制输出                [output appendString:tmpStr];    }    return output;}


留下备用:

    d:以带符号的十进制整数形式输出整数(正数不输出符号)。 
    o:以无符号八进制整数形式输出整数(不输出前导符O)。 
    x:以无符号十六进制整数形式输出整数(不输出前导符Ox)。 
    u:以无符号十进制整数形式输出整数。 
    c:以字符形式输出,输出一个字符。 
    s:以字符串形式输出,输出字符串的字符至结尾符’\O’为止。 
    f:以小数形式输出实数,隐含输出1位整数,6位小数。 
    e:以标准指数形式输出实数,数字部分隐含1位整数,6位小数。 
    g:根据给定的值和精度,自动选择f与e中较紧凑的一种格式,不输出无意义的O。 
    一般数据默认的输出宽度等于数据的实际位数。例如: 
    int a一3,b一12;float x一1.23,y一4.785; 
    ①printf(“a=%d,b=%d”,a,b); 
    输出结果:a=3,b===12 
    ②printf("%f*%f一%f",x,y,x*y); 
    输出结果:1.230000*4.785000—5.885550     
    对输出格式,C语言同样提供附加格式字符,用以对输出格式作进一步描述。 
    l:用于长整型数据输出(%ld,%lo,%lx,%lu),以及双精度型数据输出(%lf,%le,%lg)。 
    m:域宽,十进制整数,用以描述输出数据所占宽度。如果m大于数据实际位数,输出时前面补足空格;如果m小于数据的实际位数,按实际位数输出。 
    n:附加域宽,十进制整数,用于指定实型数据小数部分的输出位数。如果n大于小数部分的实际位数,输出时小数部分用O补足;如果n小于小数部分的实际位数,输出时将小数部分多余的位4舍5入。如果用于字串数据,表示从字串中截取的字符数。